算法导论 查找 二分查找
目录
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(输出):