zoukankan      html  css  js  c++  java
  • 算法导论 查找 二分查找

    目录                                                                                      

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

             

  • 相关阅读:
    how to .bson file into mongodb
    celery 源生框架项目
    @property装饰器将getter方法变成了属性
    类继承实现--停车场可用车位
    vue 基于 webpack 中使用 ECharts
    windows10 docker 从C盘迁移到其他盘
    python 布隆过滤器的下载使用
    深入系统同步锁机制 GIL
    男神鹏:ubantu 18.0.4 安装go 1.10.4 和环境变量的配置以及卸载
    男神鹏:命令 'ls' 可在 '/bin/ls' 处找到
  • 原文地址:https://www.cnblogs.com/zhoutaotao/p/3822505.html
Copyright © 2011-2022 走看看