vlambda博客
学习文章列表

Java:[算法]二分查找 南京传媒学院-寇超杰

二分查找是一种算法,其输入是一个有序元素列表(必须有序)。查找成功返回其元素位置。

原理:

示例:[1,2,3,.......,98,99,100]

如果要查找一个1-100的数,假设从头开始查找,如果查找的数为99,那么需要99次才能成功。但如果从中间开始查找,从50开始,比较查找的数和50的大小,99大于50,这样就直接排除了一半的数字。再从51-100的中间数查找:75,99大于75,这样就又排除掉一半的数,以此类推,直到成功为止。这种算法查找1-100的任何数都可以在7次之内查找到,因为我们每次都排除掉一半的数字。这种算法叫做二分查找,时间复杂度为O(log2n);

而Java中有内置方法可以直接实现二分查找Arrays.binarySearch(object[ ], object key);

/*二分查找*/
import java.util.Arrays;import java.util.Scanner;
public class TwoPointLookup { public static void main(String[] args) { int[] arr = new int[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; /*int result = Arrays.binarySearch(arr, 8); //Java中自带的方法binarySearch就是二分查找 System.out.println(result + 1); */ //.binarySearch(object[ ], object key); Scanner reader = new Scanner(System.in); int result = reader.nextInt(); System.out.println(BinarySearch(arr, result)); }
/* * @二分查找 * @arr[] int数组 * @result 需要查找的元素 * @二分查找的数组必须是个有序数组 * */ private static int BinarySearch(int[] arr, int result) { int low = 0, high = arr.length - 1; while (low <= high) {
int mid = (low + high) / 2; if (result > arr[mid]) { low = mid + 1; } else if (result < arr[mid]) { high = mid - 1; } else { return mid + 1; } } return 0; }}