算法导论 查找 二分查找 目录                                                                                       内容                                                                                       

         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(输出):

         算法导论 查找 二分查找
目录                                                                                      
内容