博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二分查找
阅读量:5291 次
发布时间:2019-06-14

本文共 1366 字,大约阅读时间需要 4 分钟。

1 实践题目
2 问题描述

输入n值(1<=n<=1000)、n个非降序排列的整数以及要查找的数x,使用二分查找算法查找x,输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。

输入格式:

输入共三行: 第一行是n值; 第二行是n个整数; 第三行是x值。

输出格式:

输出x所在的下标(0~n-1)及比较次数。若x不存在,输出-1和比较次数。

输入样例:

41 2 3 41

输出样例:

02 要求设置一个长度为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.心得体会

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

 

转载于:https://www.cnblogs.com/Archerkk/p/9789792.html

你可能感兴趣的文章
纯代码Tom
查看>>
C Looooops(poj2115+扩展欧几里德)
查看>>
Monkey测试
查看>>
二、Statement 、PreparedStatement 、CallableStatement
查看>>
selenium学习
查看>>
bzoj3110: [Zjoi2013]K大数查询 【树套树,标记永久化】
查看>>
javascript学习教程之---如何从一个tab切换到banner幻灯片的转换
查看>>
psp进度统计
查看>>
perl字符串映射函数
查看>>
鱼和豆腐一起吃
查看>>
转载:编剧技巧思路乱谈
查看>>
Linux centos7 rsync工具介绍、rsync常用选项、rsync通过ssh同步
查看>>
函数堆栈
查看>>
关于在linux系统下安装jdk
查看>>
请帮我看看这个页面,红色部份如何改才能保存到ACCess数据库中
查看>>
Oracle数据库初学者入门教程
查看>>
PHP实现栈(Stack)数据结构
查看>>
python常见问题及解决
查看>>
[原创]Java 的传值小例子
查看>>
【MySQL学习】安装和配置 服务无法启动 没有报告任何错误
查看>>