二分搜尋 一種比較完美的實現方法

來源:互聯網
上載者:User

標籤:style   blog   io   ar   使用   sp   div   on   log   

 

二分搜尋,也稱二分尋找、折半搜尋,是一種在有序數組中尋找特定元素的搜尋演算法。搜尋從數組的中間元素開始,如果中間元素剛好是要尋找的元素,則搜尋結束,如果要尋找的特定元素大於(小於)中間元素,則在數組大於(小於)中間元素的一半中尋找。該演算法的遞迴實現比較容易理解,思路更清晰,但效率方面仍有提高的空間。


代碼如下:


//遞迴版本int binary_search( const int arr[], int low, int high, int key){   int mid = low+(high-low)/2; // Do not use (low+high)/2 which might encounter overflow issue   if(low>high)       return -1;   else     {       if(arr[mid]==key)          return mid;       else if(arr[mid]>key)          return binary_search(arr,low,mid-1,key);       else           return binary_search(arr,mid+1,high,key);     }}

  

需要注意的是int mid = low+(high-low)/2;而不是(low+high)/2,避免了溢出的情況。
但是當有序數組存在等值時,該方法需要根據指定的規則選取第一個(最後一個)的等值,此時只需要從mid向前(後)尋找即可。

由於尋找第一個、最後一個等值的時候,每次移動的步長為1,移動效率較低,此時可以再次使用二分尋找的方法,加快尋找速度。

代碼如下:

 

#include <cstdio>//flag 1表示尋找第一個等值 0尋找最後一個等值  int binarySearch(int *data, int length,int val,int flag){if(!data)return -1;int left,right,res;left = 0;right = length-1;res = -1;while(left<=right){int mid = left + (right-left)/2;if(data[mid]==val){res = mid;if(flag==0) {right=mid-1;}else if(flag==1){left=mid+1;} elsereturn mid;//返回索引值 }else if(data[mid]<val)left=mid+1;elseright= mid-1;}return res;}int main(){int data[10]={4,5,23,60,60,86,88,89,89,101};printf("%d\n",binarySearch(data,10,4,1));printf("%d\n",binarySearch(data,10,60,1));printf("%d\n",binarySearch(data,10,60,0));printf("%d\n",binarySearch(data,10,55,0));printf("%d\n",binarySearch(data,10,89,0));printf("%d\n",binarySearch(data,10,89,1));printf("%d\n",binarySearch(data,10,4,0));printf("%d\n",binarySearch(data,10,100,0));}

 

  

 

 

 

 

 

 

二分搜尋 一種比較完美的實現方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.