二分法查找數據


    在查找數據的時候除了暴力查找外,還可可以使用二分法查找,二分法查找又叫折半查找。二分法在查找的時候效率是比較高的,但是它有

局限性,就是僅適用於順序表,不管是升序還是降序都適用。原理就是取順序表的中間那個元素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 }

 

代碼測試過了,結果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM