一、实践题目:二分查找
输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
输入格式:
输入共三行: 第一行是n值; 第二行是n个整数; 第三行是x值。
输出格式:
输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
输入样例:
4 1 2 3 4 1
输出样例:
0 2二、问题描述1.输入:第一行输入n值,第二行输入n个非降序排列的整数,第三行输入要查找的数x。2.用二分查找算法查找x3.输出:1)x存在,输出x的下标 & 比较次数 2)x不存在,输出 -1 & 比较次数三、算法描述1.输入整数n2.用for循环输入n个非降序的整数,存入数组a[]3.输入要查找的数x4.让l指向第一个数a[0],r指向最后一个数a[n-1],初始化mid=0,flag=0来记录有无找到x,cnt=0来记录比较次数5.用while循环来找x 1)mid=(l+r)/2 比较次数可以cnt加一 2) mid和x比较,如果找到的话 flag = 1,就输出mid和cnt;如果mid比x小,则把mid+1赋值给l,继续while循环,直到mid=x 或 l > r;如果比x大,则把mid-1赋值给l,继续while循环,直到mid=x 或 l > r;6.如果flag=1,则找到了,输出x的下标mid,和比较次数cnt;如果flag=0,则没有找到,输出-1和比较次数cnt。
1 #include<iostream>
2 using namespace std;
3 int a[1010];
4 int main()
5 {
6 int n;
7 cin>>n;
8 for(int i=0;i<n;i++)
9 cin>>a[i];
10 int x;
11 cin>>x;
12 int l=0,r=n-1,mid=0,flag=0,cnt=0;
13 while(l<=r){
14 mid=(l+r)/2;
15 cnt++;
16 if(a[mid]<x){
17 l=mid+1;
18 }
19 else if(a[mid]>x){
20 r=mid-1;
21 }
22 else {flag=1;
23 break;
24 }
25 }
26 if(flag) cout<<mid<<endl<<cnt<<endl;
27 else cout<<-1<<endl<<cnt<<endl;
四、算法时间及空间复杂度分析输入、输出、赋值语句时间复杂度为O(1),查找x使用的是二分查找算法,时间复杂度为O(log n),则总时间复杂度为O(log n)分配的空间是个常数,确定的,所以空间复杂度为O(1)五、心得体会(收获&疑惑)1.实验收获1)在队友身上学到很多,队友打字很快,打代码的速度。队友可以把以前做过的题和现在的题联系等2)通过二分查找算法更了解分治法,分成几个相同的问题来求解。3)其中出现了一些错误,全局变量和局部变量的问题,在外面int初始化mid=0,在里面也初始化一个mid,语法上没错,最后在外面输出mid的时候是0.这个问题加深了我对全局变量和局部变量的认识。4)画图,举例可以帮助理解。2.疑惑