版权声明:博主GitHub网址https://github.com/29DCH,欢迎大家前来交流探讨和fork。 https://blog.csdn.net/CowBoySoBusy/article/details/82180386
二分查找又称为折半查找.在数组接近有序时有很好的效率
时间复杂度为O()=O(logn)
注意事项:
* 如果数组无序,就不能使用二分查找。
* 因为如果你排序了,但是你排序的时候已经改变了最原始的元素索引。
java源码分析:
import java.util.Arrays;
public class Test {
// Like public version, but without range checks.
private static int binarySearch0(int[] a, int fromIndex, int toIndex, int key) {
int low = fromIndex; //最小索引0
int high = toIndex - 1; //最大索引数组长度-1
while (low <= high) { //最小索引小于等于最大索引可以循环判断
int mid = (low + high) >>> 1; //求出中间索引值,(最小+最大)/2
int midVal = a[mid]; //通过中间索引获取中间值
if (midVal < key) //中间索引对应的值小于查找的值
low = mid + 1; //最小索引变化
else if (midVal > key) //中间索引对应的值大于查找的值
high = mid - 1; //最大索引变化
else
return mid; // key found //找到了
}
return -(low + 1); // key not found.//-插入点 - 1
}
public static void main(String[] args) {
int[] arr = {33,22,11,44,66,55};
System.out.println(Arrays.toString(arr)); //数组转字符串
Arrays.sort(arr); //快速排序
System.out.println(Arrays.toString(arr));
int[] arr2 = {11,22,33,44,55,66};
System.out.println(Arrays.binarySearch(arr2, 22));
/**
binarySearch底层就是调用binarySearch0(二分查找源码)方法
public static int binarySearch(int[] a, int key) {
return binarySearch0(a, 0, a.length, key);
}
*/
System.out.println(Arrays.binarySearch(arr2, 66));
System.out.println(Arrays.binarySearch(arr2, 9)); //插入点-1(0-1=-1)
}
}
输出:
[33, 22, 11, 44, 66, 55]
[11, 22, 33, 44, 55, 66]
1
5
-1