递归的折半查找算法

问题一:递归的折半查找算法
注意:折半查找有一个条件,数据必须是有顺序性的,不然折半查找毫无意义;
原问题:有一数组A[10],里面存放了十个整数,顺序递增。任意输入一个n(位于数组里外均可),如果n数与数组,则显示n位于数组中的位置,如果n不属于数组,则显示错误;要求用递归的方法实现折半查找;
扩展:适用于输入所有顺序递增数据实现折半查找。
实验代码如下:

#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int zhebanchazhao(int a[],int n,int m,int low,int high);
int main(int argc, char *argv[]) {
/*折半查找原理较简单,通过所有数据的折半,然后比较,继续以此递归,直到找出符合要求的数据即可,否则该数据不存在,输出错误!
 当然,折半查找有一个条件:本身的数据必须是有序的,不然查找毫无意义;
*/ 
 int n;
 printf("请输入待查找数据的长度:"); 
 scanf("%d",&n);
 int a[n],i,m;
 printf("请输入待查找的数字:");
 scanf("%d",&m);
 printf("依次输入待查找数据: "); 
 for(i=0;i<n;i++){
  scanf("%d",&a[i]);
 }
 int q;
 q=zhebanchazhao(a,n,m,0,n-1);
 if(q!=-1){
 printf("该数字位于全部数据的第 %d 位",q+1);
 }else{
  printf("该数字不在该数据当中;"); 
 }
 return 0;
}
//不行,方法的思路就有问题; 
 //int zhebanchazhao(int a[],int n,int m){     //m是待查数字,m在整个整个过程中是不会发生改变的; 
 // if(a[n/2]==m){
 //  return n/2;
 // }else if(a[n/2]<m){
 //  int m=n/2; 
 //  zhebanchazhao(a,n+n/2,m);
 // }else if(a[n/2]>m){
 //  zhebanchazhao(a,n/2,m);
 // } 
 //}
/*第一次出现的问题是当数据较大时,数据末端的数字查查无结果;
原因:我的递归中n+n/2有问题;这样导致比较对象不在数据范围中,数组越界;
*/
 int zhebanchazhao(int a[],int n,int m,int low,int high){ 
 while(low<=high){
  int s=(low+high)/2;
  if(m==a[s]){
   return s;
  }else if(m>a[s]){
   low=s+1;
   return zhebanchazhao(a,n,m,low,high);
  }else if(m<a[s]){
   high=s-1;
   return zhebanchazhao(a,n,m,low,high);
  }
 } 
 if(low>high){
  return -1;
 } 
}

运行结果:

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值