二分查找

问题:如何在一个严格递增序列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

 

posted @ 2020-03-24 17:30  树下一朵云  阅读(412)  评论(0编辑  收藏  举报