实践题目:7-1二分查找(20分)

问题描述:输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数

算法描述:求取序列的中位数,比较查找数x与中位数的大小,中位数比查找数x大,截取中位数左则序列作为新的序列,中位数比查找数x小,截取中位数右则序列作为新的序列;重复以上操作,直到找到x。

算法时间及空间复杂度分析:

时间复杂度:O(log2n),n个元素每次分为一半,如n,n/2,n/4,....n/2^k,其中k就是循环的次数n/2^k取整后>=1,即令n/2^k=1,可得k=log2n,(是以2为底,n的对数),所以时间复杂度可以表示O(h)=O(log2n);

空间复杂度为数组空间大小,是一个常数,与变量n的取值无关。所以空间复杂度为O(1)

心得体会:在做题的时候,算法是没有问题的,主要是因为函数没有返回值,陷入了死循环,这次做题让我知道了返回值的的主要性。

 代码展示:

 1 #include<iostream>
 2 using namespace std;
 3 int BibarySearch(int a[],int x,int n)
 4 {
 5     int left =0;
 6     int right =n-1;
 7     int count =0;
 8     while(left<=right){
 9         int mid =(left+right)/2;
10         count++;
11         if(x==a[mid]){
12             cout<<mid<<endl;
13             cout<<count<<endl;
14             return mid;
15         }
16         if (x>a[mid])left=mid+1;
17         else
18             right=mid-1;
19     }
20     cout<<"-1"<<endl;
21         cout<<count<<endl;
22         // return -1;
23 }
24 int main()
25 {
26     int i, n;
27     cin>>n;
28     int* a =new int[n];
29     for(i=0;i<n;i++)cin>>a[i];
30     int x;
31     cin>>x;
32     BibarySearch(a,x,n);
33     return 0;
34 }

 

posted on 2018-10-21 23:59  xm_Dream  阅读(240)  评论(0)    收藏  举报