1、实践题目
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
2、问题描述
本道题是让我们输入非降序排列的整数,也就是说是排好序的了,然后输入我们要查找的数字,如果找到了,就输出所找的那个数在数组中的位置并输出比较的次数;如果没有找到的话,就输出-1还有比较的次数。
3、算法描述
使用二分法查找,每查找一次,问题规模减小为原来的一般,即将输入的序列存在一个数组里,假设要查找的数字为x,那么就是让x与a[n/2]比较。如果两者相等的话,那么x就找到了,算法结束。若是不相等的话,则根据x是大于a[n/2]还是小于a[n/2]决定是要在哪一部分里继续寻找。若x>a[n/2],则在数组的右半部分继续寻找;若x<a[n/2],则在数组的左半部分继续寻找。
代码如下:
#include <iostream>
using namespace std;
int BinarySearch(int a[],int x,int n){
int left = 0;
int right =n-1;
int count =0;
while(left <= right){
int middle = (left + right)/2;
count++;
if(x== a[middle]){
cout<<middle<<endl;
cout<<count;
return middle;
}
if(x>a[middle]){
left =middle + 1;
}
else {
right = middle -1;
}
}
cout<<"-1"<<endl;
cout<<count;
return -1;
}
int main(){
int n;
cin>>n;
int *a=new int[n];
for(int i=0; i<n;i++){
cin>>a[i];
}
int x;
cin>>x;
BinarySearch(a,x,n);
return 0;
}
4、算法时间及空间复杂度分析(要有分析过程)
对于n个元素:
第一次二分:n/2
第二次二分:n/2^2
......
m次二分:n/(2^m)
2^m=n;
故时间复杂度为:log2n
空间复杂度:因为各个变量的空间复杂度都是O(1),所以算法空间复杂度为O(1)。
5、心得体会(对本次实践收获及疑惑进行总结)
这次的二分查找算法实践,加深了我对二分法的理解。因为书本上有二分法查找的相关内容,我们没出现大问题。问题是出现在数组的定义上。我们一起找,没找到,最后上网查了一下才知道原来是我们数组定义的时候出了错!真的是有认真思考过才会印象深刻,因为我们在检查的过程中一遍又一遍的看我们写的代码,所以现在是比较熟悉,在被第一道题目困住,最后解决之后,第二道题目很快就做出来了。
原文地址:https://www.cnblogs.com/lincanji/p/9784633.html