目錄
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(輸出):