算法-二分搜索算法

算法:二分搜索算法(折半查找算法)
時間復雜度:O(log \;n)

  • 二分搜索算法概述
  • 二分搜索算法偽代碼
  • 二分搜索算法實現(xiàn)

二分搜索算法概述

二分搜索算法即彪,也稱折半查找算法,即在一個有序數(shù)組中查找某一個特定元素。整個搜索過程從中間開始轻庆,如果要查找的元素即中間元素攘蔽,那么搜索過程結束;反之根據(jù)中間元素與要查找元素的關系在數(shù)組對應的那一半查找,例如查找元素大于中間元素枢步,則在整個數(shù)組較大元素的那一半查找砖茸,反復進行這個過程,直到找到元素,或者數(shù)組為空蹲姐,查找不到元素顷扩。

二分搜索算法描述

給定一個數(shù)組A_0,A_1...A_{n-1}A_0 \le A_1 \le \cdot \le A_{n - 1}东臀,待查找元素為searchnum

  1. left赁濒,right分別表示左右端點,即要查找的范圍;
  2. middle表示中間點,middle = \lfloor (left + right) / 2 \rfloor
  3. left > right,搜索失敗;
  4. A{middle} > searchnumright = middle - 1,返回3;
  5. A{middle} < searchnumleft = middle + 1,返回3派桩;
  6. A{middle} = searchnum员魏,搜索結束,返回middle镇匀。

二分搜索算法偽代碼

while 實現(xiàn)

BINARY-SEARCH-WHILE(A, searchnum, left, right)

while left <= right
  middle = (left + right) div 2
  case
    A_middle < searchnum : left = middle + 1
    A_middle > searchnum : right = middle - 1
    A_middle = searchnum : return middle
return FAILED

遞歸實現(xiàn)

BINARY-SEARCH-RECURSION(A, searchnum, left, right)

if left <= right
  middle = (left + right) div 2
  case
    A_middle < searchnum :
      return (A, searchnum, middle + 1, right)
    A_middle > searchnum :
      return (A, searchnum, left, middle - 1)
    A_middle = searchnum :
      return middle

二分查找算法實現(xiàn)

C

while 版本

int binarySearch(arrType * a, arrType searchnum, int left, int right)
{
    int middle;
    while (left <= right) {
        middle = (left + right) / 2;
        if (a[middle] > searchnum)
            right = middle - 1;
        else if (a[middle] < searchnum)
            left = middle + 1;
        else if (a[middle] == searchnum)
            return middle;
    }
    return -1;
}

遞歸版本

int binarySearch(arrType * a, arrType searchnum, int left, int right)
{
    int middle;
    if (left <= right) {
        middle = (left + right) / 2;
        if (a[middle] > searchnum)
            return binarySearch(a, searchnum, left, middle - 1);
        else if (a[middle] < searchnum)
            return binarySearch(a, searchnum, middle + 1, right);
        else if (a[middle] == searchnum)
            return middle;
    }
    return -1;
}

Pascal

外部定義全局變量:

var
    a : array[1..n] of integer;
    searchnum, result :integer;

while 版本

procedure binarySearch(left, right :integer);
var
    middle : integer;
begin
    while (left <= right) do
        begin
            middle := (left + right) div 2;
            if (a[middle] > searchnum) then
                right := middle  - 1
            else if (a[middle] < searchnum) then
                left := middle + 1
            else
                begin
                    result := middle;
                    break;
                end;
        end;
    if left > right then
        result := -1;
end;

遞歸版本

procedure binarySearch(left, right :integer);
var
    middle : integer;
begin
    if left <= right then
        begin
            middle := (left + right) div 2;
            if (a[middle] > searchnum) then
                binarySearch(left, middle - 1)
            else if (a[middle] < searchnum) then
                binarySearch(middle + 1, right)
            else
                result := middle;
        end
    else
        result := -1;
end;

參考資料

本文首發(fā)于個人博客算法 - 二分搜索算法 | 不存在的貓, 轉載請注明出處

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末闷堡,一起剝皮案震驚了整個濱河市杠览,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌佛点,老刑警劉巖怀喉,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異回季,居然都是意外死亡家制,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門泡一,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颤殴,“玉大人,你說我怎么就攤上這事鼻忠『” “怎么了?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵粥烁,是天一觀的道長贤笆。 經(jīng)常有香客問我,道長讨阻,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任篡殷,我火速辦了婚禮钝吮,結果婚禮上,老公的妹妹穿的比我還像新娘板辽。我一直安慰自己奇瘦,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布耳标。 她就那樣靜靜地躺著,像睡著了一般砸琅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上诱篷,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天,我揣著相機與錄音橙凳,去河邊找鬼岛啸。 笑死荡灾,一個胖子當著我的面吹牛,可吹牛的內容都是我干的荧缘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼豆瘫,長吁一口氣:“原來是場噩夢啊……” “哼育灸!你這毒婦竟也來了描扯?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤羡铲,失蹤者是張志新(化名)和其女友劉穎扑媚,沒想到半個月后费坊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡人弓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年峰鄙,在試婚紗的時候發(fā)現(xiàn)自己被綠了囊扳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狭瞎。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖搏予,靈堂內的尸體忽然破棺而出熊锭,到底是詐尸還是另有隱情,我是刑警寧澤雪侥,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布碗殷,位于F島的核電站,受9級特大地震影響速缨,放射性物質發(fā)生泄漏锌妻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一旬牲、第九天 我趴在偏房一處隱蔽的房頂上張望仿粹。 院中可真熱鬧搁吓,春花似錦、人聲如沸吭历。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毒涧。三九已至贮预,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間契讲,已是汗流浹背仿吞。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留捡偏,地道東北人唤冈。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像银伟,于是被迫代替她去往敵國和親你虹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內容

  • 排序算法說明 (1)排序的定義:對一序列對象根據(jù)某個關鍵字進行排序彤避; 輸入:n個數(shù):a1,a2,a3,…,an 輸...
    code武閱讀 662評論 0 0
  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經(jīng)驗傅物。 張土汪:刷leetcod...
    土汪閱讀 12,744評論 0 33
  • 夏天熱 樹躲到葉子下乘涼 秋天涼 樹甩掉葉子曬太陽 冬天難熬 樹把自己放進冰箱 春天很美 樹開始耍流氓 激情后 一...
    安正樹閱讀 173評論 7 4
  • 哈佛名校里董饰,威爾有故事。 威爾圆米,一名清潔工卒暂。他,帥氣卻很陰郁娄帖。每天清晨也祠,好基友會開著帶著歲月感的老爺車來敲威爾的灰...
    穩(wěn)穩(wěn)的小妞閱讀 318評論 3 2
  • 時光飛逝鬢染霜, 生命之樹年輪長…… 冬(夏)令營快樂多近速, 我與孩子共飛翔…… 回遷新居話感恩诈嘿, 造物主賜幸福享…...
    海迪哲lshj閱讀 1,409評論 12 11