zoukankan      html  css  js  c++  java
  • Binary Search--二分查找

     

    Binary Search--二分查找

      采用二分法查找时,数据需是排好序的。 基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段 中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。

      二分法查找在针对大量有序排列的情况下发挥出很优越的效率,其时间复杂度O(lgN)。

      

      代码:

     1 /*
     2 Author:Mengmeng
     3 Time:2016-6-27 23:33:49
     4 Description:
     5     采用二分法查找时,数据需是排好序的。 
     6     基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,
     7     如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段 中查找;
     8     若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。
     9 */
    10 #include <iostream>
    11 using namespace std;
    12 
    13 
    14 int BinarySearch(int data[],int min,int max,int dest,bool UpOrDown)
    15 {
    16     int mid = 0;
    17     if (min > max)//递归结束条件
    18     {
    19         cout << "找不到" << dest << "!"<<endl;
    20         return -1;
    21     }
    22     mid = (max + min) / 2;
    23     if (dest == data[mid])//递归结束条件
    24         return mid;
    25     if (UpOrDown == true)//升序排列
    26     {
    27         if (dest < data[mid])//递归条件
    28             return BinarySearch(data, min, mid - 1, dest, true);
    29         else
    30             return BinarySearch(data, mid + 1, max, dest, true);
    31     }
    32     else//降序排列
    33     {
    34         if (dest < data[mid])
    35             return BinarySearch(data, mid + 1, max, dest, false);
    36         else
    37             return BinarySearch(data, min, mid - 1, dest, false);
    38     }
    39     
    40 
    41 
    42 }
    43 int main(void)
    44 {
    45     int data1[] = { 0, 11, 22,33,44,55,66,77,88,99 };
    46     int data2[] = { 99, 88, 77, 66, 55, 44, 33, 22, 11, 0 };
    47 #if 0
    48     cout << "请参照下列数字:" << endl;
    49     cout<< "{";
    50     int len = sizeof(data1) / sizeof(int);
    51     for (int i = 0; i < len; i++)
    52         cout << data1[i] << " ";
    53     cout << "}" << endl;
    54     cout << "输入你要查找的目标:" << endl;
    55     int dest;
    56     cin >> dest;
    57     cout <<"----------------------------------------"<< endl;
    58     int index = BinarySearch(data1, 0, len - 1, dest,true);
    59 #endif
    60 #if 1
    61     cout << "请参照下列数字:" << endl;
    62     cout << "{";
    63     int len = sizeof(data2) / sizeof(int);
    64     for (int i = 0; i < len; i++)
    65         cout << data2[i] << " ";
    66     cout << "}" << endl;
    67     cout << "输入你要查找的目标:" << endl;
    68     int dest;
    69     cin >> dest;
    70     cout << "----------------------------------------" << endl;
    71     int index = BinarySearch(data2, 0, len - 1, dest, false);
    72 #endif
    73     if (index!=-1)
    74         cout << dest << "在数组中的位置为第" << index << "" << endl;
    75     return 0;
    76 
    77 }

      运行结果:

      (1)升序的情况:

        

      

      (2)降序的情况:

        

      

  • 相关阅读:
    简单修改 MySQL 的 root 账号密码
    树莓派 Raspberry-Pi 折腾系列:系统安装及一些必要的配置
    [原创] JavaScript 图片放大镜插件 enlarge.js 以及移动版 enlarge.touch.js
    丢掉 WinPE,使用 DISKPART 来分区吧
    【原创】只用 HTML / CSS 画出一把 UKULELE(夏威夷四弦吉他)
    用网页模拟手机(安卓)通知列表中的「清除」效果
    关于 Google Chrome 中的全屏模式和 APP 模式
    简单好用的 AJAX 上传插件,还可以抛弃难看的 file 按钮哦~
    C# 操作 Excel 常见问题收集和整理(定期更新,欢迎交流)
    C++:几种callable实现方式的性能对比
  • 原文地址:https://www.cnblogs.com/codingmengmeng/p/5621945.html
Copyright © 2011-2022 走看看