算法第二章上机实践报告

7-1 二分查找 (20 分)

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

代码描述

#include<iostream>
using namespace std;
int count=0;
int binarySearch(int a[],int left, int right, int x){
count++;
if(left==right&&a[left]!=x){
return -1;
}
else{
int mid = (left+right)/2;
if(a[mid]==x){
return mid;
}

if(x>mid){
return binarySearch(a,mid+1,right,x);
}
else{
return binarySearch(a,left,mid-1,x);
}
}
}
int a[1005];
int main(){
int x,n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
cin>>x;
int ans;
ans = binarySearch(a,0,n-1,x);
cout<<ans<<endl<<count;
return 0;
}

算法时间空间复杂度分析

因为二分查找每次排除一半的值,最好的情况是排除一次就得到结果,最坏的情况是排除到只剩一个值才得到结果,所以其时间复杂度为log2(n),空间复杂度为O(1)。

心得体会

实践前虽然大概了解二分搜索的思路,但却只是停留在把一组有序数列一次次缩半而已,而这次实践让我对二分搜索的细节了解的更加清晰,如在编写代码过程中,在缩半前要先比较大小,接着还要改下标,本次实践让我将二分搜索的思路写出代码,了解其更多细节,而不仅仅是停留在大概了解上。

posted @ 2018-10-14 22:41  Kdj  阅读(176)  评论(0编辑  收藏  举报