在查找數據的時候除了暴力查找外,還可可以使用二分法查找,二分法查找又叫折半查找。二分法在查找的時候效率是比較高的,但是它有
局限性,就是僅適用於順序表,不管是升序還是降序都適用。原理就是取順序表的中間那個元素mid,然后用中間的元素mid和待查找元素x進
行比較大小,以此改變下次的查找區間,使得下次的查找區間縮短一半,所以它又叫折半查找,這樣就可節省一半的時間,極大的提高了效率。
在百度上找了張二分法查找的圖,看一下具體是怎么實現的,上圖
然后再用代碼來實現,上代碼
1 #include<iostream> 2 using namespace std; 3 4 int binarySearch(int a[],int x,int N) //二分查找;x為待查找元素,N為有序表大小 5 { //a雖然為順序表,但可能是升序,也可能是降序,所以要兩種情況;通過比較首尾元素大小即可 6 if(a[0]<a[N-1]) //此順序表是升序 7 { 8 int left=0,right=N-1,mid; 9 while(left<=right) 10 { 11 mid=(left+right)/2; 12 if(x==a[mid]) 13 return mid; //查找成功返回就返回索引 14 else if(x<a[mid]) 15 right=mid-1; 16 else 17 left=mid+1; 18 } 19 } 20 else //此順序表為降序 21 { 22 int left=0,right=N-1,mid; 23 while(left<=right) 24 { 25 mid=(left+right)/2; 26 if(x==a[mid]) 27 return mid; //查找成功返回就返回索引 28 else if(x>a[mid]) 29 right=mid-1; 30 else 31 left=mid+1; 32 } 33 } 34 return -1; //查找失敗 35 } 36 int main() 37 { 38 int index; 39 int a[10]={1,2,3,4,5,6,7,8,9,10}; 40 int b[10]={10,9,8,7,6,5,4,3,2,1}; 41 index=binarySearch(a,5,10); 42 if(index==-1) 43 cout<<"查找失敗"<<endl; 44 else 45 cout<<"查找成功,結果為:"<<a[index]<<" 索引為:"<<index<<endl; 46 index=binarySearch(b,5,10); 47 if(index==-1) 48 cout<<"查找失敗"<<endl; 49 else 50 cout<<"查找成功,結果為:"<<b[index]<<" 索引為:"<<index<<endl; 51 return 0; 52 }
代碼測試過了,結果如下: