二分法查找算法

题目:写一个二分法查找算法。如果找不到返回一个负数,找到了返回对应的下标值。

      二分法在查找的很多数据量的时候比较快,不过使用前提是数据已经排好序了。这是查找算法,使用前需要调用排序算法。

基本思路就是取每次的一个中间值,如果发现中间值是要找的就直接返回下标,不是要找的就更换查找区间。所以肯定是不停循环了。

      每次查找时确定两个数字,开始位置lowIndex,结束位置 highIndex。取中间位置,对比数据。发现没找到,如果是中间数字比较大,

那么肯定查找的是比较靠前的位置。所以范围就是原先的前一半位置,也就是highIndex是mid -1 为什么还要减一呢?因为mid这个已经

找过了,所以就是mid-1呗。

public void test(){
	int[] arr = new int[] {12, 14, 18, 20, 36, 40};
	int mid = search(arr, 40);
	System.out.println(mid);
}
	
private int search(int[] arr, int target) {
	return search0(arr, 0, arr.length, target);
}

private int search0(int[] arr, int formIndex, int toIndex, int target) {
	int lowIndex = formIndex;
	int highIndex = toIndex -1; // 长度 - 1 = 最大下标值
	while (lowIndex <= highIndex ) {
		int mid = (lowIndex + highIndex) >>> 1; // 等价于 / 2
		int crrVal = arr[mid];
			
		if(crrVal < target){
			lowIndex = mid +1; // 中间值比目标值小,下次查找区间后半段
		}else if(crrVal > target){
			highIndex = mid -1; // 中间值比目标值大,下次查找区间前半段
		}else {
			return mid;
		}
			
	}
		
	return -(lowIndex +1);
}


你可能感兴趣的:(二分法查找)