Ytl's Java Blog

          厚積而薄發---每一天都是一個全新的開始
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          二分查找的優化和完備

          Posted on 2011-03-15 12:12 ytl 閱讀(2639) 評論(5)  編輯  收藏 所屬分類: 學習總結 、Java基礎
          關于二分查找的原理互聯網上相關的文章很多,我就不重復了,但網絡的文章大部分講述的二分查找都是其中的核心部分,是不完備的和效率其實還可以提高,如取中間索引使用開始索引加上末尾索引的和除以2,這種做法在數字的長度超過整型的范圍的時候就會拋出異常,下面是我的代碼,其中可能有些地方沒考慮到或有什么不足,希望大家指出,我虛心接受。
           1
           public class Sort {
           2    
           private int binarySort(int[] array, int begin, int end, int value, int call) {
           3         // 顯示每次調用過程和查找所用的的次數(call)
           4         System.out.print(begin + "\t" + end + "\t" + call + "\n");
           5         // 如果每次數組的第一個數或最后一個數等于查找的相等直接返回
           6         if (array[begin] == value)
           7             return begin;
           8         if (array[end] == value)
           9             return end;
          10         // 如果查詢的數字不在數組里面,直接返回-1,從而提高效率
          11         if (array[begin] > value)
          12             return -1;
          13         if (array[end] < value)
          14             return -1;
          15         // 如果查詢數組只有兩個數那可以直接通過判斷第一個或最后一個是否是查詢值
          16         if ((end - begin) < 2) {
          17             if (array[begin] == value)
          18                 return begin;
          19             if (array[end] == value)
          20                 return end;
          21         }
          22 
          24          // 下面 mid=(int) (begin + (end - begin) / 2) 可以防止數字長度大于整型數的長度導致異常
          26         int mid = (int) (begin + (end - begin) / 2);
          27         // 下面是通用的二分查找算法
          28         if (array[mid] == value)
          29             return mid;
          30         if (array[mid] > value) {
          31             return binarySort(array, begin, mid - 1, value, call + 1);
          32         }
          33         return binarySort(array, mid + 1, end, value, call + 1);
          34 
          35     }
          36 
          37     public int sort(int[] array, int value) {
          39         return binarySort(array, 0, array.length - 1, value, 1);
          40     }
          41 }
          下面是測試結果:
          1 int[] array = { 123345677891011121213,
          2                 14151617181920212122232324252626,
          3                 272829 };

          1,System.out.println(sort(array, 1));
          0 34 1
          0
          2,System.out.println(sort(array, 29))
          0 34 1
          34
          3,System.out.println(sort(array, 6))
          0 34 1
          0 16 2
          0 7 3
          4 7 4
          6 7 5
          6
          4,System.out.println(sort(array, 28))
          0 34 1
          18 34 2
          27 34 3
          31 34 4
          33 34 5
          33
          5,System.out.println(sort(array, -11))
          0 34 1
          -1
          6,System.out.println(sort(array, 100))
          0 34 1
          -1
          7,System.out.println(sort(array, 7))
          0 34 1
          0 16 2
          8(如果有重復的返回的索引是最后一個)、

          評論

          # re: 二分查找的優化和完備  回復  更多評論   

          2011-03-15 12:26 by fy
          還不錯,值得學習

          # re: 二分查找的優化和完備  回復  更多評論   

          2011-03-20 10:40 by 嚕嚕
          mid比end小吧,end是int型,mid怎么會溢出呢

          # re: 二分查找的優化和完備  回復  更多評論   

          2011-03-24 16:22 by dennis
          沒必要用遞歸吧,還可以優化,展開成循環。

          # re: 二分查找的優化和完備  回復  更多評論   

          2011-04-20 14:25 by ytl
          @嚕嚕
          怎么不會溢出呢,heihei,

          假設數組的長度剛好是int取值的最大值,
          查找的值大于mid 那么下次的折半的mid = (mid+1+last)
          (mid+1+last)大于int 范圍吧。

          # re: 二分查找的優化和完備[未登錄]  回復  更多評論   

          2011-08-17 00:33 by ray
          mid = (l+r) / 2
          畢竟2分查找還是比較追求速度的,而且r>2^31的情況基本不會出現,因為沒有那么大一個數組。
          另外,貌似這個是binarySearch,不是"Sort"吧
          主站蜘蛛池模板: 英山县| 桐城市| 新泰市| 梧州市| 崇文区| 南华县| 陇西县| 洛南县| 福海县| 铜川市| 滦平县| 襄垣县| 滁州市| 大荔县| 东源县| 河池市| 广丰县| 芮城县| 张家口市| 元氏县| 自治县| 大悟县| 平遥县| 株洲市| 平乡县| 新兴县| 三原县| 淮安市| 安丘市| 和政县| 司法| 二连浩特市| 常山县| 江山市| 钦州市| 化州市| 林甸县| 穆棱市| 元江| 洛隆县| 冷水江市|