问题一:递归的折半查找算法
注意:折半查找有一个条件,数据必须是有顺序性的,不然折半查找毫无意义;
原问题:有一数组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;
}
}
运行结果: