算法第二章上机实践报告

1.实践题目:7-1二分查找

2.问题描述:

输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。

3.算法描述:

定义left和right分别表示a数组第一和最后一个数,用mid代表中间的数,即mid =(left+right)/2。

比较所要查找的数x与mid对应值的大小:若数x大于mid的对应值,说明数x在mid到n-1的区间里,此时left=mid+1;若数x小于mid的对应值,说明在0到mid区间,此时right=mid-1,依此循环最终可找出x。

定义一个变量count,每进行一次循环count都+1,count即为比较次数。

源代码如下:

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

4.算法时间和空间复杂度:

时间复杂度为O(log n):每执行一次while循环,待搜索数组的大小就减小一半。因此在最坏情况下,while循环被执行了O(log n)次。

空间复杂度为O(1):此算法的空间复杂度为一个常量,即不随被处理数据量n的大小而改变时,可表示为O(1)。

5.心得体会:

这道题其实很简单,我们却花了很多时间在上面,明明思路都是对的,就是显示答案错误,我们一直在想到底为什么。原来是粗心打错了,把 x>a[mid] 打成了 x>mid ,一下子没注意到mid指的是地址而非对应值,就这么一个基础的错误我们两个人都没看见,浪费了很多时间。以后一定要仔细一点!

posted @ 2018-10-15 16:49  winkeybobo  阅读(190)  评论(0)    收藏  举报