遇到了一面试题:说1000数内最多需要查多少次。脑袋短路,我的晕啊,居然没做出来,
回来在eclipse里测试了两下,其实并不复杂,逻辑清楚了,代码就很容易了,
查找多少次还真没找到规律,还是请教了谷老师,原来有个公式叫都是在1和log2n+1之间
后来查了下该算法的优劣:
优点是比较次数少,查找速度快,平均性能好,缺点肯定就是要求待查表为有序表,且插入删除困难了。
其实和集合框架的工具类Collections中的二分查找一样的。
package algorithm;
public class BinarySearch {
public static void main(String[] args) {
int[] src = new int[]{1,3,5,7,9,10};
System.out.println(binarySearch(src,5));
}
public static int binarySearch(int[] srcArray, int des){
int low = 0;// 最小数
int high = srcArray.length -1; //最大数
int number = 0;// 定义查找次数
while(low <= high){
++number;
int middle = (low + high)/2;
if(des == srcArray[middle]){
System.out.println("number:" + number);
return middle;
}else if(des < srcArray[middle]){
high = middle - 1;
}else{
low = middle + 1;
}
/*
* 下面是没有对2相除,而是用了移位运算,了解了下移位比相除效率要高些,数据量少的话很难看出差距的。
* int low = 0;
int high = srcArray.length-1;
while (low <= high) {
int mid = (low + high) >>> 1;
int cmp = srcArray[mid];
if (cmp < des)
low = mid + 1;
else if (cmp > des)
high = mid - 1;
else
return mid;
}
return -(low + 1);
* */
}
}