第二章上机实践报告

题目如下:

输入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

本次的算法描述如下:


本次算法我和我的搭档使用了二分法;就是如果x=a[middle]则找到了x,那么就将If语句结束。
如果x不等于a[middle],x<a[middle]则再数组的左边进行查找。
如果x>a[middle]则再数组的有边进行查找。
再重复第一步,然后进入循环,直到找到x。
同时还需要再做一步判断。若数组中没有x,则输出-1。
而在实验报告上我的PTA上提交的代码如下

#include <iostream>
using namespace std;
int BinarySearch(int a[],int x,int n){
int left = 0;
int right =n-1;
int count =0;
while(left <= right){
int middle = (left + right)/2;
count++;
if(x== a[middle]){
  cout<<middle<<endl;
  cout<<count;
return middle;
}
if(x>a[middle]){
left =middle + 1;
}
else {
right = middle -1;
}
}

cout<<"-1"<<endl;

cout<<count;

return -1;

}

int main(){
int n;
cin>>n;
int *a=new int[n];
for(int i=0; i<n;i++){
cin>>a[i];
}
int x;
cin>>x;
BinarySearch(a,x,n);
return 0;

}

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

二分查找是近期学习的一个重点内容,也顺便借助这次上机复习了一次。而因为二分查找每次排除掉一半不适合条件的数,一次二分就会剩下:n/2;两次二分剩下:n/2/2 = n/4;......;m次二分剩下:n/(2^m)。而在最坏情况下是在排除到只剩下最后一个值之后得到结果,所以为n/(2^m)=1;2^m=n;因此时间复杂度为:log2n 

空间复杂度则更加容易去判断:每个变量的空间复杂度都是O(1),所以算法空间复杂度为O(1)。

心得与体会

其实我发现大一大二学习的C++基础以及数据结构都是比较不扎实的,所以在算法实现过程中,我觉得我不能很好的去实现,所以我在二分查找上是看了书才能打出来的,这就暴露了我代码能力的薄弱之处,当然,其实算法的学习认真听讲了之后还是可以去理解的,只是比较难的是实践而已,所以我还是需要努力把课本上更多的算法去实现出来,提升自己的编程能力的同时,学习好算法的相关知识。

posted @ 2018-10-14 23:27  鸡哥最叻叻  阅读(91)  评论(0编辑  收藏  举报