算法第二章上机实践报告
7-1 二分查找
问题描述:
输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
算法描述:
对有序数列进行二分查找。每一次取数列的中位数与目标数比较,如相等直接输出,若小于目标数,取中位数右半数列再进行比较,若大于,则取左半数列。期间,每比较一次,记录比较次数的变量加一。直到所剩数列没有元素为止。
#include<iostream>
using namespace std;
int find(int a[],int x,int n)
{
int l=0, r=n-1,t=0;
while(l<=r){
int mid=(l+r)/2;
if(a[mid]==x) {
t++;
cout<< mid<<endl<<t;
return 0;
}
else if(a[mid]<x) {
l=mid+1;
t++;
}
else {
r=mid-1;
t++;
}
}
cout<< "-1"<<endl<<t;
return 0;
}
int main()
{
int n,i=1,t=0;
cin>>n;
int arry[n+1];
for(i=0;i<n;i++){
cin>>arry[i];
}
int x;
cin>>x;
find(arry,x,n);
}
时间即空间复杂度:
二分查找中,每比较一次,数列的长度就减小一半,while循环的时间复杂度是O(log n),循环内的运算需要O(1)的时间复杂度,所以整个算法时间复杂度是O(log n)
整个算法请求了一个int和一个int [n] 的空间,空间复杂度分别是O(1) 和O(n),所以最终空间复杂度是O(n)
心得:
在二分查找的基础上要求输出比较次数,虽看似简单,但是在每一次的递归调用中要记录好次数,注意输出和返回值,更要清楚递归调用的条件。在算法设计之外还要懂得分析,在分析中改进完善。