一、实践题目:二分查找
输入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.疑惑