基本思想
二分查找算法,也叫折半搜索算法,一般来讲,二分查找算法常用于一个有序数组(也可以用于无序数组,下一节讲解)。在搜索时,首先选择一个中点,如果中点比目标值小,则往右边查找,否则,往左边查找,这样可以使每次搜索的范围减少一半。
具体的细节我建议大家去看代码中的逻辑,跟着代码走一遍,会理解的更加清楚,话不多说上代码
代码示例
/**
* 二分查找法
*/
public class BinarySearch {
/**
* @param arr 有序数组,注意必须有序
* @param x 要查找的值
* @return 目标值在数组中的下标
*/
public static int binarySearch(int []arr,int x){
int left = 0;
int right = arr.length-1;
while(left <= right){
int mid = left + ((right - left) >> 1);
if (arr[mid] == x){
return mid;
}else if(arr[mid] < x){
left = mid + 1;
}else{
right = mid - 1;
}
}
return -1;
}
public static void main(String[] args) {
int[] arr = {1,2,3,4,5,6,7,8,9,10};
int index = binarySearch(arr,6);
System.out.println(index);
}
}
细节
在代码运行的过程中,要么往左压缩数组,要么往右压缩数组,因此算法结束的标志是left>right。牢记结束标志,写代码时会快很多。
复杂度分析
因为二分查找每次减少一半搜索范围,所以对于n个元素的情况:
1次划分剩下 n/2
2次划分剩下 n/4
…
m次划分剩下 n/(2^m) = 1,最后一次时等于1
因此m = log(n)
时间复杂度为O(log(n))
因为只用了常数个有限空间,因此空间复杂度为O(1)
尾注
留下笔记,只为方便回忆,如有侵权,还请联系,如有错误,恳请纠正。陆续更新,还请关注。