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

    实现思路:

    1、从数组的中间开始寻找,如果中间的数据小于要寻找的目标则从中间往右边寻找,继续是从右边的中间开始。

    2、从数组的中间开始寻找,如果中间的数据大于要寻找的目标则从中间往左边寻找,继续是从左边的中间开始。

    前提:在使用二分查找的时候数组是用先排序好的,递增和递减都可以。

    具体代码如下:

    #include <iostream>
    
    using namespace std;
    
    
    /***********************************************************
     * 非递归实现二分查找
     * @参数
     * @source:要查找的目标数组
     * @low:数组的最小的下标
     * @high:数组的最大的下标
     * @target:要查找的目标
     * *********************************************************/
     int bisect_serach(int *source,int low,int high,int target)
     {
        int mid = 0;
        while(low <= high)
        {
            mid = (low+high)/2;
            if(source[mid]>target)
            {
                high = mid-1;
            }
            else if(source[mid]<target)
            {
                low = mid+1;
            }
            else if(source[mid]==target)
                return mid;
        }
       return -1; //没有找到
     }
    
    
    
     /***********************************************************
      * 递归实现二分查找
      * @参数
      * @source:要查找的目标数组
      * @low:数组的最小的下标
      * @high:数组的最大的下标
      * @target:要查找的目标
      * *********************************************************/
      int bisect_serach_rec(int *source,int low,int high,int target)
      {
         int mid = 0;
         mid = (low+high)/2;
         if (low > high)
             return -1; //没有找到
    
         else if(source[mid]>target)
         {
           bisect_serach_rec(source,low,mid-1,target);
         }
         else if(source[mid]<target)
         {
             bisect_serach_rec(source,mid+1,high,target);
         }
    
         else if(source[mid]==target)
             return mid;
    
      }
    
    
    int main()
    {
       int i = 0;
       int position;
       int *source = new int[10];
       for(i=0;i<10;i++)
           source[i] = i;
    
        position = bisect_serach(source,0,9,22);
        if(position == -1)
        {
          cout<<"not found the data"<<endl;
        }
        cout<<position<<endl;
        delete []source;
        return 0;
    }
  • 相关阅读:
    echarts 报表使用
    Eclipse Java注释模板设置详解
    简单实现支付密码输入框 By HL
    一个label 混搭不同颜色,不同字体的文字.. by 徐
    有关MVC设计模式 #DF
    自定义粘贴板-陈鹏
    TableView 常用技巧与功能详解
    ios 类别和扩展-赵小波
    推荐一本书--《浪潮之巅》(完整版的哦)----董鑫
    iOS block的用法 by -- 周傅琦君
  • 原文地址:https://www.cnblogs.com/wurenzhong/p/8651085.html
Copyright © 2011-2022 走看看