递归之二分算法

本文介绍了一种高效的查找算法——二分查找,并通过一个具体的示例详细解释了其工作原理及实现过程。适用于已排序的数据集,能显著提高查找效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 [例 题]

       设有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;

}

       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值