题解——冒泡+二分查找
Posted 昵称竟然不能小于四位
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解——冒泡+二分查找相关的知识,希望对你有一定的参考价值。
题解——冒泡+二分查找
文章目录
题目链接:
传送门
题面
描述
有一组数据放在数组R[ ]
中,R[ ]=9,8,7,6,0,-1,10,-5,-32,66
,请调用冒泡排序函数(自己定义函数),先将数组进行排序,然后调用二分查找算法(自己定义函数)查找某数,分别给出比较次数,每个比较次数占一行,比较次数为-1
时表示没找到。
输入
第1行输入排序标志,为1
时,对原数组先采用升序排序,为2
时,对原数组采用降序排序。
第2行开始输入待查找的数。输入非整数
或^Z
时,结束输入。
输出
采用二分查找法查找某数时的比较次数,每个比较次数占一行,比较次数为-1
时表示没找到。
样例输入
1
-1
25
6
样例输出
3
-1
1
提示
直接在程序里定义R[ ]=9,8,7,6,0,-1,10,-5,-32,66
ps. 这里有点狠!让你直接在程序里定义,结果原题混入一个中文逗号!
题解
这个题对大家来说陌生的地方可能主要在于输入要求:
输入非整数或^Z时,结束输入。
^Z
其实是ctrl+Z
的意思,这是一个文件结束符,当你在键盘上敲ctrl+Z
的时候,相当于输入了“文件结束符”,你的程序必须能读取“文件结束符”,并使输入停止。
我们一步一步来:
首先按题意,定义数组r
#include <iostream>
using namespace std;
int r[]=9,8,7,6,0,-1,10,-5,-32,66;
ps. 为了方便使用,我们直接把它定义为全局变量
冒泡排序
升序
void cin_up()
int t;
for(int i=0;i<10;i++)
for(int j=0;j<9;j++)
if(r[j]>r[j+1]) //升序
t=r[j],r[j]=r[j+1],r[j+1]=t;
降序
void cin_down()
int t;
for(int i=0;i<10;i++)
for(int j=0;j<9;j++)
if(r[j]<r[j+1]) //降序
t=r[j],r[j]=r[j+1],r[j+1]=t;
二分查找
首先需要注意的一点是,二分算法可能需要根据序列的增减性不同而作出相应调整,如:
- 若待查找序列为升序,如
0 1 2 3 4 5 6
,要找5
,第一次mid=(0+6)/2=3
,r[mid]=3<5
,此时应该进行的操作是l=mid+1
; - 若待查找序列为降序,如
6 5 4 3 2 1 0
,还是要找5
,第一次r[mid]=3<5
,此时进行的操作就不是l=mid+1
了,而是r=mid-1
;
因此,我们干脆就写两个二分查找函数,根据升序/降序的不同选择性地调用它们即可。
二分查找——升序
int binFind_up(int key)
int L=0,R=9,mid,num=0;
while (L<=R)
num++;
mid=(L+R)/2;
if(r[mid]==key)return num;
else if(r[mid]<key)
L=mid+1;
else
R=mid-1;
return -1;
二分查找——降序
int binFind_down(int key)
int L=0,R=9,mid,num=0;
while (L<=R)
num++;
mid=(L+R)/2;
if(r[mid]==key)return num;
else if(r[mid]>key)
L=mid+1;
else
R=mid-1;
return -1;
输入
AC做法
int main()
int n; // 排序标志n
cin>>n;
if(n==1)
cin_up(); // 采用升序排序
else if(n==2)
cin_down(); // 采用降序排序
int x;
while (cin>>x) // 符合要求的数据输入方法
if(n==1)cout<<binFind_up(x)<<endl;
else cout<<binFind_down(x)<<endl;
return 0;
原理
为什么可以把cin
直接放在while
的条件里呢?这就要从cin
函数的返回值说起。函数cin
也是有返回值的。当:
- 遇到文件结束符
ctrl+Z
的时候,返回0
; - 遇到无效输入的时候,返回
0
,比如待输入的数是整数,但你输入了非整数; - 有效输入返回
1
;
因此,我们可以直接定义int
型的待输入变量x
,然后直接将cin>>x
放在while
的判断条件内,就可以“歪打正着”地实现题目要求的功能。
以上是关于题解——冒泡+二分查找的主要内容,如果未能解决你的问题,请参考以下文章