Java中二分查找

二分法定義:
對(duì)于區(qū)間[a,b]上連續(xù)不斷且f(a)·f(b)<0的函數(shù)y=f(x)婉商,通過不斷地把函數(shù)f(x)的零點(diǎn)所在的區(qū)間一分為二,使區(qū)間的兩個(gè)端點(diǎn)逐步逼近零點(diǎn),進(jìn)而得到零點(diǎn)近似值的方法叫二分法繁莹。(百度百科)

給定一個(gè)數(shù)組,我們要查找當(dāng)前數(shù)據(jù)在數(shù)組中的位置特幔,雖然可以使用循環(huán)一個(gè)個(gè)遍歷咨演,但是由于要使代碼運(yùn)行時(shí)間盡可能的小,所以我們要采用二分法來查找蚯斯。
先上代碼:

public class BinarySearch {

  /**
   * Searches element k in a sorted array.
   * @param arr a sorted array
   * @param k the element to search
   * @return index in arr where k is. -1 if not found.
   */
  public int binarySearch(int[] arr, int k) {
    int a = 0;
    int b = arr.length;
    // Loop invariant: [a, b) is a valid range. (a <= b)
    // k may only be within range [a, b).
    while (a < b) {
      int m = a + (b - a) / 2; // m = (a + b) / 2 may overflow!
      if (k < arr[m]) {
        b = m;
      } else if (k > arr[m]) {
        a = m + 1;
      } else {
        return m;
      }
    }
    return -1;
  }

  public static void main(String[] args) {
    BinarySearch bs = new BinarySearch();

    System.out.println("Testing normal data");
    System.out.println(
        bs.binarySearch(new int[]{1, 2, 10, 15, 100}, 15));
    System.out.println(
        bs.binarySearch(new int[]{1, 2, 10, 15, 100}, -2));
    System.out.println(
        bs.binarySearch(new int[]{1, 2, 10, 15, 100}, 101));
    System.out.println(
        bs.binarySearch(new int[]{1, 2, 10, 15, 100}, 13));
    System.out.println("======");

    System.out.println("Testing empty or singleton data.");
    System.out.println(
        bs.binarySearch(new int[]{}, 13));
    System.out.println(
        bs.binarySearch(new int[]{12}, 13));
    System.out.println(
        bs.binarySearch(new int[]{13}, 13));
    System.out.println("======");

    System.out.println("Testing data of size 2.");
    System.out.println(
        bs.binarySearch(new int[]{12, 13}, 13));
    System.out.println(
        bs.binarySearch(new int[]{12, 13}, 12));
    System.out.println(
        bs.binarySearch(new int[]{12, 13}, 11));
  }

當(dāng)使用二分查找的時(shí)候有幾個(gè)注意點(diǎn):
1薄风、當(dāng)前數(shù)據(jù)長(zhǎng)度是否大于1。
2拍嵌、數(shù)組的長(zhǎng)度范圍如何去定義遭赂。
3、在使用二分的時(shí)候横辆,如果數(shù)組長(zhǎng)度過大撇他,數(shù)組收尾相加數(shù)據(jù)過大,導(dǎo)致數(shù)據(jù)溢出咋辦龄糊。

解決 第一個(gè)問題:
我們首先判斷數(shù)組的尾減去數(shù)組的頭看是否大于"0"

第二個(gè)問題:
我們將數(shù)組.length當(dāng)成數(shù)組的尾逆粹,而不是數(shù)組.length-1,大家都知道數(shù)組下標(biāo)是從"0"開始的炫惩,但是為什么不用數(shù)組.length-1呢僻弹?
我們直接使用數(shù)組.length的時(shí)候可以形成一個(gè)左閉右開區(qū)間,方便數(shù)組相加他嚷。如:[a,b)+[b,c) =[a,c)
而且我們直接使用數(shù)組.length的時(shí)候判斷左邊的時(shí)候直接小于就行蹋绽,不用再去判斷等于條件。

第三個(gè)問題:

  c = ( a + b ) / 2

當(dāng)a和b過大的時(shí)候筋蓖,a + b的數(shù)據(jù)就更大卸耘,導(dǎo)致數(shù)據(jù)溢出咋辦,這個(gè)時(shí)候我們選擇使用

  c = a + (b - a) / 2

來解決這個(gè)問題粘咖。

上面代碼運(yùn)行結(jié)果:


在這里插入圖片描述
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蚣抗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瓮下,更是在濱河造成了極大的恐慌翰铡,老刑警劉巖钝域,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異锭魔,居然都是意外死亡例证,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門迷捧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來织咧,“玉大人,你說我怎么就攤上這事漠秋◇厦桑” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵膛堤,是天一觀的道長(zhǎng)手趣。 經(jīng)常有香客問我,道長(zhǎng)肥荔,這世上最難降的妖魔是什么绿渣? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮燕耿,結(jié)果婚禮上中符,老公的妹妹穿的比我還像新娘。我一直安慰自己誉帅,他們只是感情好淀散,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蚜锨,像睡著了一般档插。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上亚再,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天郭膛,我揣著相機(jī)與錄音,去河邊找鬼氛悬。 笑死则剃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的如捅。 我是一名探鬼主播棍现,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼镜遣!你這毒婦竟也來了己肮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎朴肺,沒想到半個(gè)月后窖剑,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戈稿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讶舰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鞍盗。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖跳昼,靈堂內(nèi)的尸體忽然破棺而出般甲,到底是詐尸還是另有隱情,我是刑警寧澤鹅颊,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布敷存,位于F島的核電站,受9級(jí)特大地震影響堪伍,放射性物質(zhì)發(fā)生泄漏锚烦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一帝雇、第九天 我趴在偏房一處隱蔽的房頂上張望涮俄。 院中可真熱鬧,春花似錦尸闸、人聲如沸彻亲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)苞尝。三九已至,卻和暖如春宦芦,著一層夾襖步出監(jiān)牢的瞬間宙址,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工踪旷, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留曼氛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓令野,卻偏偏與公主長(zhǎng)得像舀患,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子气破,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 專業(yè)考題類型管理運(yùn)行工作負(fù)責(zé)人一般作業(yè)考題內(nèi)容選項(xiàng)A選項(xiàng)B選項(xiàng)C選項(xiàng)D選項(xiàng)E選項(xiàng)F正確答案 變電單選GYSZ本規(guī)程...
    小白兔去釣魚閱讀 9,000評(píng)論 0 13
  • 在一個(gè)方法內(nèi)部定義的變量都存儲(chǔ)在棧中聊浅,當(dāng)這個(gè)函數(shù)運(yùn)行結(jié)束后,其對(duì)應(yīng)的棧就會(huì)被回收,此時(shí)低匙,在其方法體中定義的變量將不...
    Y了個(gè)J閱讀 4,418評(píng)論 1 14
  • 本文是我自己在秋招復(fù)習(xí)時(shí)的讀書筆記旷痕,整理的知識(shí)點(diǎn),也是為了防止忘記顽冶,尊重勞動(dòng)成果欺抗,轉(zhuǎn)載注明出處哦!如果你也喜歡强重,那...
    波波波先森閱讀 2,792評(píng)論 0 10
  • 臨近畢業(yè)的時(shí)候我心里特別慌張间景。讀了二十年的書依然有著百無一用是書生的感覺佃声。3000的起薪像一塊千斤巨石壓的我喘...
    Hatsukoiy閱讀 772評(píng)論 0 1
  • 常說手中的沙攥的越緊 流走的越快 可是沙尤如那時(shí)間 即使不握緊 留在掌心里的也有那么一點(diǎn)就是 今天 常想感嘆時(shí)光太...
    霂隱閱讀 466評(píng)論 0 0