二分查找

1 实践题目
2 问题描述

输入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
要求设置一个长度为n的数组,输入数组并进行排序,然后利用二分查数值x,查找成功后输出其所在位置及比较次数,否则输出-1及比较次数;
另外,n的范围、输入格式及输出格式都有要求:0<=n<=1000;输入共三行: 第一行是n值; 第二行是n个整数; 
第三行是x值。查找成功则输出其所在位置及比较次数,否则输出-1及比较次数。

3.算法描述:首先,二分查找在查找前先用left和right指针表示数组第一和最后一个数,接着用middle代表数组中间的数,(left+right)/2这一地址值赋给middle。
然后将要查找的目标数与middle对应值的比较,若目标数比middle对应值大,说明目标数在middle到n-1的区间里,此时把middle值赋给left,
同理,当目标数比middle对应值小,则说明在0到middle区间,此时把middle值赋给right,依此循环最终可找出x。在这过程中,定义一个变量t,令其在每次循环中都+1,最终得到比较次数。

#include <iostream>
using namespace std;
int BinarySearch(int a[],int x,int n){
int left = 0;
int right =n-1;
int k =0;
while(left <= right){
int middle = (left + right)/2;
k++;
if(x== a[middle]){
cout<<middle<<endl;
cout<<k;
return middle;
}
if(x>a[middle]){
left =middle + 1;
}
else {
right = middle -1;
}

}
cout<<"-1"<<endl;
cout<<k;
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,.算法时间和空间复杂度:

算法时间复杂度为O(log n),此算法时间复杂度为while循环次数,因为每次查找范围减半,因此最坏情况下要执行(log n)次循环。、

空间复杂度为O(1),此算法使用辅助空间存储相应变量,与问题规模大小无关因此空间复杂度为O(1)

5.心得体会

对于除了做作业很少动手的我来说,这次结队做题让我认识了自己的不足,同时也体会到了有能够共同交流的伙伴的重要性



posted @ 2018-10-15 17:19  Archer丶kk  阅读(465)  评论(0编辑  收藏  举报