標籤: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));}
二分搜尋 一種比較完美的實現方法