算法-二分搜索算法

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

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

二分搜索算法概述

二分搜索算法,也稱折半查找算法,即在一個(gè)有序數(shù)組中查找某一個(gè)特定元素。整個(gè)搜索過(guò)程從中間開(kāi)始,如果要查找的元素即中間元素,那么搜索過(guò)程結(jié)束;反之根據(jù)中間元素與要查找元素的關(guān)系在數(shù)組對(duì)應(yīng)的那一半查找,例如查找元素大于中間元素,則在整個(gè)數(shù)組較大元素的那一半查找,反復(fù)進(jìn)行這個(gè)過(guò)程,直到找到元素,或者數(shù)組為空,查找不到元素。

二分搜索算法描述

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

  1. leftright分別表示左右端點(diǎn),即要查找的范圍;
  2. middle表示中間點(diǎn),middle = \lfloor (left + right) / 2 \rfloor
  3. left > right,搜索失?。?/li>
  4. A{middle} > searchnum,right = middle - 1,返回3;
  5. A{middle} < searchnum,left = middle + 1,返回3;
  6. A{middle} = searchnum,搜索結(jié)束,返回middle。

二分搜索算法偽代碼

while 實(shí)現(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

遞歸實(shí)現(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

二分查找算法實(shí)現(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ā)于個(gè)人博客算法 - 二分搜索算法 | 不存在的貓, 轉(zhuǎn)載請(qǐng)注明出處

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容