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

    问题:如何在一个严格递增序列A中找出给定的数x。

    直接的办法:线性扫描——复杂度:O(n)

    二分查找:——Olog(n)

     1 /*
     2     2020年3月24日12:23:35
     3     算法设计作业 第一题
     4 */
     5 
     6 /*题目:
     7     给定有序数组A以及一个元素x,设计一个寻找x的分治算法并分析其时间复杂度,
     8     要求返回x在数组中的位置。
     9 */
    10 
    11 //严格有序序列找给定的数——二分查找
    12 
    13 #include<iostream>
    14 using namespace std;
    15 const int maxn = 101;
    16 
    17 int judge_incre(int x[],int num) //判断数组是否递增
    18 {
    19     int minx = x[0];
    20     int flag = 1;
    21     for(int j = 1;j < num;j++)
    22     {
    23         if(x[j] < minx)
    24         {
    25              flag = 0;
    26              break;
    27         }
    28         else
    29         {
    30             minx = x[j];
    31         }
    32     }
    33     if(flag == 0)
    34         return 0;
    35     else
    36         return 1;
    37 }
    38 
    39 //二分区间为左闭右闭的[left,right],传入的初值为[0,n-1],x为欲查询的数
    40 int binarySearch(int A[],int left,int right,int x)
    41 {
    42     int mid; //mid为left和right的中间点
    43     while(left <= right)  
    44     {
    45         mid = (left + right) / 2;
    46         if(A[mid] == x)
    47         {
    48             return mid; //找到x,返回下标
    49         }
    50         else if(A[mid] > x) //中间数大于x
    51         {
    52             right =mid - 1; //往子区间[left,mid-1]查找
    53         }
    54         else //中间数小于x
    55         {
    56             left = mid + 1; //往子区间[mid+1,right]查找
    57         }
    58     }
    59     return -1; //查找失败
    60 }
    61 
    62 int main()
    63 {
    64     int a[maxn];
    65     //数组a为严格递增序列
    66     int n; //数组元素个数
    67     cout << "请输入数组a的元素个数:n = ";
    68     cin >> n;
    69     cout << "请输入递增序列:";
    70     for(int i = 0;i < n;i++)
    71     {
    72         cin >> a[i];
    73     }
    74     if(judge_incre(a,n))
    75     {
    76         int x;
    77         cout << "请输入要查找的数:x = ";
    78         cin >> x;
    79 
    80         if(binarySearch(a,0,n-1,x) != -1)
    81         {
    82             cout << x << "的下标为:" << binarySearch(a,0,n-1,x) << endl;
    83         }
    84         else
    85         {
    86             cout << "抱歉!查无此数!" << endl;
    87         }
    88     }
    89     else
    90         cout << "输入数组不正确!请重新输入!" << endl;
    91     
    92     return 0;
    93 }

    注意:

    如果二分上界超过int型数据的一半,那么当欲查询元素在序列靠后的位置时,语句mid=(left+right)/2中的left+right就有可能超过int型而导致溢出;此时应使用mid=left+(right-left)/2

  • 相关阅读:
    学习过程之python跳一跳
    OSError: [WinError -2147221003] 找不到应用程序: 'QR.png' 的解决方法
    易知大学 任务25 第一次爬虫与测试
    linux常用命令
    健身日志
    JavaScript JSON
    常用注解 开发SpringBoot项目
    网络基础
    jQuery MINI UI 学习之分页查询
    Springboot集成ActivitiModel提示输入密码
  • 原文地址:https://www.cnblogs.com/wlyperfect/p/12560297.html
Copyright © 2011-2022 走看看