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)降序的情况:

        

      

  • 相关阅读:
    java.sql.SQLException: Io 异常: Got minus one from a read call
    ORACLE 数据库名、实例名、ORACLE_SID的区别
    如何查看oracle的sid
    expdp impdp 数据库导入导出命令详解
    Oracle连接数过多释放机制
    oracle查看允许的最大连接数和当前连接数等信息
    世界是无限的、复杂的、运动的
    世界
    世界观和方法论是一致的,有怎样的世界观就有怎样的方法论
    运动着的物质世界是普遍联系和永恒发展的
  • 原文地址:https://www.cnblogs.com/codingmengmeng/p/5621945.html
Copyright © 2011-2022 走看看