二分查找算法

遇到了一面试题:说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);
   * */
 }
}

你可能感兴趣的:(二分查找算法)