实践题目: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 }
Dream
浙公网安备 33010602011771号