算法第二章上机实验报告

◇◆丶佛笑我妖孽 提交于 2019-11-30 06:26:15

 一、实践题目:二分查找 

输入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.疑惑            
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!