半窗疏影,一梦千年,琴歌萧萧笛声怜
二分查找有一个必须条件,就是数组是有顺序的,可以从小到大,也可以从大到小。
二分查找虽然有时候查找效率比不上其他查找算法,但是总体上看来,二分查找还是一种比较简单而且效率比较高的查找算法。
- LeetCode中一个二分查找为例。
用二分查找实现代码如下:
class Solution {
public int search(int[] nums, int target) {
if((nums.length==1)&&(target==nums[0]))return 0;
int left=0;
int rigth=nums.length-1;
while(left<=rigth){
int minIndex=(left+rigth)/2;
int minValue=nums[minIndex];
if(minValue<target){
left=minIndex+1;
}else if(minValue>target){
rigth=minIndex-1;
}else{
return minIndex;
}
}
return -1;
}
}
二分查找最重要的是找中间值minValue,使之与目标值作比较。步骤一般如下:
- 定义左右“指针”,一个指向开头:left,一个指向尾部:right。
- 定义一个循环体,当left小于等于right时进行循环。因为当left大于right时,说明不存在要找的值,就可以终止循环了。
- 查找值和当前数组的minValue比较。查找值大于minValue就让left等于minValue+1,范围缩小一半。
- 查找值和当前数组的minValue比较。查找值小于minValue就让right等于minValue-1,范围缩小一半。
- 当查找值等于minValue,即找到目标数。