Ytl's Java Blog

          厚積而薄發(fā)---每一天都是一個(gè)全新的開(kāi)始

          二分查找的優(yōu)化和完備

          Posted on 2011-03-15 12:12 ytl 閱讀(2639) 評(píng)論(5)  編輯  收藏 所屬分類(lèi): 學(xué)習(xí)總結(jié)Java基礎(chǔ)
          關(guān)于二分查找的原理互聯(lián)網(wǎng)上相關(guān)的文章很多,我就不重復(fù)了,但網(wǎng)絡(luò)的文章大部分講述的二分查找都是其中的核心部分,是不完備的和效率其實(shí)還可以提高,如取中間索引使用開(kāi)始索引加上末尾索引的和除以2,這種做法在數(shù)字的長(zhǎng)度超過(guò)整型的范圍的時(shí)候就會(huì)拋出異常,下面是我的代碼,其中可能有些地方?jīng)]考慮到或有什么不足,希望大家指出,我虛心接受。
           1
           public class Sort {
           2    
           private int binarySort(int[] array, int begin, int end, int value, int call) {
           3         // 顯示每次調(diào)用過(guò)程和查找所用的的次數(shù)(call)
           4         System.out.print(begin + "\t" + end + "\t" + call + "\n");
           5         // 如果每次數(shù)組的第一個(gè)數(shù)或最后一個(gè)數(shù)等于查找的相等直接返回
           6         if (array[begin] == value)
           7             return begin;
           8         if (array[end] == value)
           9             return end;
          10         // 如果查詢(xún)的數(shù)字不在數(shù)組里面,直接返回-1,從而提高效率
          11         if (array[begin] > value)
          12             return -1;
          13         if (array[end] < value)
          14             return -1;
          15         // 如果查詢(xún)數(shù)組只有兩個(gè)數(shù)那可以直接通過(guò)判斷第一個(gè)或最后一個(gè)是否是查詢(xún)值
          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) 可以防止數(shù)字長(zhǎng)度大于整型數(shù)的長(zhǎng)度導(dǎo)致異常
          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 }
          下面是測(cè)試結(jié)果:
          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(如果有重復(fù)的返回的索引是最后一個(gè))、

          評(píng)論

          # re: 二分查找的優(yōu)化和完備  回復(fù)  更多評(píng)論   

          2011-03-15 12:26 by fy
          還不錯(cuò),值得學(xué)習(xí)

          # re: 二分查找的優(yōu)化和完備  回復(fù)  更多評(píng)論   

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

          # re: 二分查找的優(yōu)化和完備  回復(fù)  更多評(píng)論   

          2011-03-24 16:22 by dennis
          沒(méi)必要用遞歸吧,還可以?xún)?yōu)化,展開(kāi)成循環(huán)。

          # re: 二分查找的優(yōu)化和完備  回復(fù)  更多評(píng)論   

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

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

          # re: 二分查找的優(yōu)化和完備[未登錄](méi)  回復(fù)  更多評(píng)論   

          2011-08-17 00:33 by ray
          mid = (l+r) / 2
          畢竟2分查找還是比較追求速度的,而且r>2^31的情況基本不會(huì)出現(xiàn),因?yàn)闆](méi)有那么大一個(gè)數(shù)組。
          另外,貌似這個(gè)是binarySearch,不是"Sort"吧

          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 襄樊市| 乌兰县| 海宁市| 金门县| 望城县| 夏河县| 阜阳市| 信阳市| 揭东县| 成武县| 邓州市| 集安市| 新化县| 涿州市| 隆化县| 绥德县| 刚察县| 资阳市| 佳木斯市| 阿克苏市| 郴州市| 堆龙德庆县| 曲麻莱县| 洪泽县| 平安县| 额济纳旗| 建宁县| 江孜县| 临漳县| 伊川县| 桓台县| 弥勒县| 留坝县| 泽库县| 遂宁市| 济源市| 临湘市| 都昌县| 亳州市| 深水埗区| 黔东|