二分查找 又叫 折半查找。是对一组有序数列的查找,必须是有序的,下面根据一个简单的例子来说明一下。
2 | 5 | 6 | 9 | 14 | 23 | 25 | 32 | 36 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
第一行为数组 aaa[ 9 ] 的9个数
第二行为数组的下标
这9个数是有序排列,假如要查找此数组 aaa 中是否存在32这个数 ?
1—》 总是找数组中间那个数去比较, x=(0+8)/2=4 ,aaa[ x ]=14 就是第一次查找的中间数;
2—》 14<32,所以到5~8位去找;
3—》总是找中间那个数去比较, x=(5+8)/2=6(说一下,本来是6.5,但是下标变量x是int型,所以变成了6) , aaa[ x ]=25 ,
4—》25<32,所以到7~8位去找;
5—》总是找中间那个数,x=(7+8)/2=7,aaa[ x ]=32,找到了,到此OK。
思想:就是不断地去和中间那个数比较,然后才知道是去左半部分找,还是去右半部分找, 然后再进入到其中,再去比较中间那个数,依次下去。(就是一半一半地分下去,直到找到)
时间复杂度(最坏情况):O(log N)。
下面是算法的代码实现。
public int BinaryChop(int[] array,int value){ //第一个参数为数组,第二个参数为要查询的值
int low=0;
int hight=len-1;
int mid;
while (low<=hight){
mid=(low+hight)/2;
if(array[mid]==value){
return mid; //如果找到了,就返回该值的下标
}
else if(array[mid]<value){
low=mid+1;
}
else {
hight=mid-1;
}
}
return -1; //如果找不到,就返回-1
}