标签:查找 cin 结合 二分 using 一起 操作 i++ count
选了二分查找算法题目如下:
输入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
算法描述如下:
本次算法我使用了二分法;就是如果x=a[middle]则找到了x,那么就将If语句结束。
如果x不等于a[middle],x<a[middle]则再数组的左边进行查找。
如果x>a[middle]则再数组的有边进行查找。
再重复第一步,然后进入循环,直到找到x。
同时还需要再做一步判断。若数组中没有x,则输出-1。
代码的实现附下图:
#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;
}
算法时间及空间复杂度分析
二分查找根据我自己的理解:
l 给出定值K,然后与表中的中间元素进行关键字比较,若相等,中,则向右查找,直到找到关键词的我们则返回他的存储位置;如果不等的话,则如二分查找算法题位置。
因为二分查找每次排除掉一半不适合条件的数,一次二分就会剩下:n/2;两次二分剩下:n/2/2 = n/4;......;m次二分剩下:n/(2^m)。而在最坏情况下是在排除到只剩下最后一个值之后得到结果,所以为n/(2^m)=1;2^m=n;因此时间复杂度为:log2n
空间复杂度:每一个变量的空间复杂度都是O(1),所以算法空间复杂度为O(1)。
心得与体会
其实在实验室上机的时候和同伴一起做的时候发现实现二分查找过程是很简单的,因为课堂上老师也有讲过用迭代或者非迭代的方式去实现。但是实际操作的时候,在空手打代码的时候发现在实现算法的过程还是十分的生疏的,像二分查找的过程我们都是要看着书来打才打的上去,不能做到将理论与实验轻易的结合,这大该就是大神和菜鸟之间缺乏实践的原因吧,所以我还是太过于缺乏代码的实验,课本上的代码实验还是要自己好好去实现。不然真的有很多的bug出现让我在课堂上都通过不了,这就十分尴尬了。
标签:查找 cin 结合 二分 using 一起 操作 i++ count
原文地址:https://www.cnblogs.com/yamaforyou/p/9788725.html