输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。
三、算法描述:
#include <iostream>
#include <stdlib.h>
using namespace std;
int BS(int a[],int n,int x){
int low,high,mid;
low=0;
high=n-1;
int count=0;
while(low<=high)
{
mid=(low+high)/2;
count++;
if(x==a[mid]){
cout<< mid<<endl;
cout<< count;
return 0;
}
else if(x<a[mid]){
high=mid-1;
}
else{
low=mid+1;
}}
cout<< -1<<endl;
cout<< count;
return 0;
}
int main() {
int n;
cin>> n;
int a[1000];
for(int i=0;i<n;i++)
{
cin >> a[i];
}
int x;
cin >> x;
BS(a,n,x);
system("pause");
}
通过寻找值先与数组中的中间值作比较,再以中间值与边界值的区间为新的范围。重复以上比较,直到找到要寻找的数值,若不存在即输出-1。在其中,可以设一个初始值,寻找数值每与中间值比较一次,即自身+1,以此获得比较次数。最后找到寻找数值后输出下标。
四、算法时间及空间复杂度分析:
二分查找法即是将问题分为两个小块,所以时间复杂度为:T(n) = T(n/2) +O(1)=O(logn)
由于数组空间是常数,所以空间复杂度为O(1)。
五、心得体会:
因为这次是我的第一次上机实践。迫切想解决第二题,可是其实第二题就在第一题的基础之上。所以让我想到二分算法也是如此,把大问题变成较小问题,再如此分下去。
二分算法,把中间值作为比较,把问题的解决范围减小,大大减少了程序的执行时间。
老师实行的一人打代码一人讲解代码的方法也很好,让我们对算法了解更加深刻。