【演算法】二分尋找__演算法

來源:互聯網
上載者:User

二分尋找這個演算法效率算是相當高的了,如此簡單又高效的演算法當然值得我們學習和研究。

首先,我們來引入一道要求二分尋找的題:


其次要明確的一點是二分尋找是建立在已經有序的序列上的。接下來我們來分析一下這個題該怎麼解。

我們先假設數組 v 中存的數是這樣的:

其中,為了方便計算,我們使對應的下標等於對應的值。然後,定義分別定義整型變數 left 和 right 指向 v 的左右邊界的下標。

然後取 mid = (left + right) / 2;

假如我們要找的 x = 5,這樣,我們比較一下 v[mid] 和 x 的值,3 < 5,所以,我們令 left = mid + 1;然後,left 指向 4 的位置,再求一次 mid

指向關係就變成了現在這樣,再比較 v[mid] 和 x 的值,我們發現,找到了。看見沒,效率就是這麼高。

最後來補上我們的原始碼:

#include <stdio.h>int bin_search(int arr[], int x, int left, int right){while (left <= right) {int mid = (right + left) / 2;if (arr[mid] > x)right = mid - 1;else if (arr[mid] < x)left = mid + 1;elsereturn mid;}return -1;}int main(void){int v[] = {0,1,2,3,4,5,6,7,8,9};int ret = 0;ret = bin_search(arr, 5, 0, 9);printf("%d\n",ret);getchar();return 0;}

是不是不難呢

但是,程式還有一個隱藏的小問題,那就是 mid 的求取方法;現在的求取方法顯然不太好,比如當 left 和 right 足夠大時在相加可能會導致溢出的問題。

所以,針對這個問題,我們又把這裡最佳化了一下:

mid = (right - left) / 2 +left;

這條語句在數學上是完全等價於我們的 mid = (left + right) / 2; 的,但是在電腦裡,我們不難看出它們之間的區別,自己想想吧。

最後再加上遞迴實現:

int bin_search_2(int arr[], int x, int left, int right){/*遞迴實現*/if (left > right)return -1;int mid = (right - left) / 2 + left;if (arr[mid] == x){return mid;}else if (arr[mid] > x){right = mid - 1;return bin_search_2(arr, x, left, right);}else{left = mid + 1;return bin_search_2(arr, x, left, right);}}


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.