算法第二章上机实践报告

Posted on 2018-10-14 21:49  黄钦伟  阅读(139)  评论(0)    收藏  举报

1,实践题目
二分查找
2,问题描述
输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,
使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。
若x不存在,输出-1和比较次数。
3,算法描述
int search(int a[1000],int left,int mid,int right,int x,int& c){
if(left>right)
return -1;
mid=(left+right)/2;
if(x==a[mid]){
c++;
return mid;
}
if(x>a[mid]){
c++;
return search(a,mid+1,mid,right,x,c);
}
if(x<a[mid]){
c++;
return search(a,left,mid,mid-1,x,c);
}
}
定义search函数,(left>right)和x==a[mid]两个比较是判断递归结束的语句,放在最前面;
当x>a[mid]时,说明查找的x位于a[mid]的右边,从而将left改为mid+1,然后进行递归;
x<a[mid]的情况同理。
4,算法时间及空间复杂度分析(要有分析过程)
时间复杂度:总共有n个元素,每次查找的区间大小就是n,n/2,n/4,…,n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数。
由于n/2^k取整后>=1,即令n/2^k=1,
可得k=log2n,(是以2为底,n的对数),所以时间复杂度可以表示O()=O(logn)
空间复杂度:该算法为简单的二分查找,没有申请使用辅助空间,所以空间复杂度为O(1)
5,心得体会(对本次实践收获及疑惑进行总结)
写算法的时候想着老师教的递归思想,从而想到了return search的语句,有了整体架构后,写起来不会太难。主要有一些
小bug:1,一开始运行结果总有问题,把比较的==写成了=,很低级的错误。2,return search语句里的各个变量位置写反了。。
3,返回次数c,用了int&类型,懂得了传值不能改变变量的值。