[例 题]:
设有n个数已经按从大到小的顺序排列,现在输入x,判断它是否在这n个数中, 如果存在则输出“YES”,否则输出"NO"。
[算法分析]:
该问题属于数据的查找问题,数据查找有多种方法,通常方法是:顺序查找和二分查找,当N个数排好序时,用二分查找速度大大加快。二分查找算法:
(1)设有n个数,存放在a数组中,待查找数为x,用L指向数据的高端,用R指向数据的低端,mid指向中间:
(2)若X=a[mid],则输出“YES”;
(3)若X<a[mid],则到数据后半段查找:R不变,L=mid+1,计算新的mid值,并进行新的一段查找;
(4)若x>a[mid],则到数据前半段查找:L不变,R=mid-1,计算新的mid值,并进行新的一段查找;
(5)若L>R都没有查找到,则输出"NO"。
该算法符合递归程序设计的基本规律,可以用递归方法设计。
[参考代码]
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[1000];
void search(int,int,int);
int main()
{int k,x,left,right;
left=1;
cin>>right;
printf("输入%d个从大到小顺序的数:",right);
for(k=1;k<=right;k++)
cin>>a[k];
cin>>x;
search(x,left,right);
return 0;
}
void search(int x,int top,int bot)
{
int mid;
if(top<=bot)
{
mid=(top+bot)/2;
if(x==a[mid]) cout<<"yes"<<endl;
else
if(x<a[mid]) search(x,mid+1,bot);
else search(x,top,mid-1);
}
else cout<<"NO"<<endl;
}