算法導論 查找 二分查找


目錄                                                                                      

         1、二分查找簡單介紹

         2、二分查找遞歸實現偽碼

         3、二分查找c++實現

         4、完整測試代碼

內容                                                                                       

         1、二分查找簡單介紹                    

二分查找算法是在有序數組中用到的較為頻繁的一種算法,在未接觸二分查找算法時,最通用的一種做法是,對數組進行遍歷,跟每個元素進行比較,其時間為O(n).但二分查找算法則更優,因為其查找時間為O(lgn),譬如數組{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法執行的話,其順序為:
    1.第一步查找中間元素,即5,由於5<6,則6必然在5之后的數組元素中,那么就在{6, 7, 8, 9}中查找,
    2.尋找{6, 7, 8, 9}的中位數,為7,7>6,則6應該在7左邊的數組元素中,那么只剩下6,即找到了。

    二分查找算法就是不斷將數組進行對半分割,每次拿中間元素和goal進行比較。

        2、 二分查找遞歸實現偽碼 T(n)=T(n/2)+Θ(1)  =》 T(n)=Θ(lgn)         

           Binary_Search(A,Low,High,Value)

                  if High<Low

                      then return -1

                  mid <- Low+[High-Low]/2  //此處不能采用[Low+High]/2,因為mid可能會因為超出數據類型的范圍而溢出

                  if A[mid]>Value

                      then return  Binary_Search(A,Low,mid-1,Value)

                      else if A[mid]<Value

                             then return Binary_Search(A,mid+1,High,Value)

                             else return mid

         3、二分查找c++實現                     

              1)遞歸c++實現

 1 template<typename T>
 2 int Sub_Binary_search(vector<T> A,int Low,int High,T value)//遞歸子程序實現
 3 {
 4     if (Low>High)//沒找到返回-1
 5        return -1;
 6     int mid=Low+(High-Low)/2;//
 7     if (A[mid]>value)// 遞歸回調
 8        return Sub_Binary_search(A,Low,mid-1,value);
 9     else if(A[mid]<value)// 遞歸回調
10         return Sub_Binary_search(A,mid+1,High,value);
11     else return mid;//找到返回索引
12 }

 

             2)非遞歸C++實現

 1 template<typename T>
 2 int binary_search_nor(vector<T> A,T value)//非遞歸實現
 3 {
 4        int low = 0;
 5         int high = A.size() - 1;
 6         while(low <= high)
 7          {
 8              int middle = low+(high-low)/2;
 9              if(A[middle] == value)
10                  return middle;         
11              else if(A[middle] > value) //在左半邊
12                  high = middle - 1;            
13              else    //在右半邊
14                  low = middle + 1;
15         }
16         //沒找到
17         return -1;
18 }

 

          4、完整測試代碼                   

            Search.h

#ifndef SEARCH_HH
#define SEARCH_HH
template<typename T>
class Search{
public:
    int Binary_search_div(vector<T> A,T value );//遞歸實現
    int binary_search_nor(vector<T> A,T value);//非遞歸實現
private:
    int Sub_Binary_search(vector<T> A,int Low,int High,T value);//遞歸子程序實現

};
template<typename T>
int Search<T>::Binary_search_div(vector<T> A,T value )//遞歸實現
{
    return Sub_Binary_search(A,0,A.size()-1,value);
}
template<typename T>
int Search<T>::Sub_Binary_search(vector<T> A,int Low,int High,T value)//遞歸子程序實現
{
    if (Low>High)//沒找到返回-1
       return -1;
    int mid=Low+(High-Low)/2;//
    if (A[mid]>value)// 遞歸回調
       return Sub_Binary_search(A,Low,mid-1,value);
    else if(A[mid]<value)// 遞歸回調
        return Sub_Binary_search(A,mid+1,High,value);
    else return mid;//找到返回索引
}
template<typename T>
int Search<T>::binary_search_nor(vector<T> A,T value)//非遞歸實現
{
       int low = 0;
        int high = A.size() - 1;
        while(low <= high)
         {
             int middle = low+(high-low)/2;
             if(A[middle] == value)
                 return middle;         
             else if(A[middle] > value) //在左半邊
                 high = middle - 1;            
             else    //在右半邊
                 low = middle + 1;
        }
        //沒找到
        return -1;
}
#endif

 

    主函數:Search.cpp

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 #include "Search.h"
 5 
 6 int main()
 7 {
 8     int a[]={1,2,3,4,5,6,7,8,9};
 9     vector<int> vec(a,a+9);
10     Search<int> sea_vec;
11     cout<<sea_vec.Binary_search_div(vec,3)<<endl;//index從0開始
12     cout<<sea_vec.binary_search_nor(vec,4)<<endl;
13     cout<<sea_vec.Binary_search_div(vec,0)<<endl;//index從0開始
14     cout<<sea_vec.binary_search_nor(vec,10)<<endl;
15     system("PAUSE");
16     return 0;
17 };

     output(輸出):

         


免責聲明!

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



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