今天是冬至呀!!!大家记得吃饺子,吃汤圆,吃好多好吃的!!!
在本篇文章中我将为大家介绍一种数据查找方法——折半查找(并附加完整代码)
问题背景:
我们要在一个数据为{1,2,3,4,5,6,7,8,9,10}的顺序表中查找某一个元素的具体位置。
算法设计:
首先,我们需要建立一个顺序表,并且将给出的数据保存到顺序表中;
然后,我们需要建立一个基础的结构框架,并确定主函数与子函数之间的参数;
然后,我们开始编写我们的子函数,使我们的子函数实现查找的功能,在这里我们使用折半查找的算法实现目标程序;
最后,我们对已经编写出的代码进行调试和运行;
折半查找:
折半查找又称为二分查找,其使用前提是顺序表有序。
对于该方法我们需要三个指针mid(指向中心位置)、low(指向头部)、high(指向尾部),然后我们将我们需要查找的数值与mid指向的数值进行比较,如果数值与mid指向的数据相等,则返回mid;如果数据小于mid则high=mid-1,进行递归查找;如果数据大于mid则low=mid+1,进行递归查找;递归查找停止的条件是high<=low。
完整实现代码:
#include<stdio.h>
#include<malloc.h>
//顺序表元素的结构
typedef struct sq
{
int data;
int number;
}Sq;
//折半查找函数
int Reaserch(Sq *s,int dest,int n)
{
int low=0,high=n-1,mid,count=1;
while(low<=high)
{
mid=(low+high)/2;
printf("第%d次在[%d,%d]中比较元素%d\n",count++,low,high,s[mid].data);
if(s[mid].data==dest)
return mid+1;
if(s[mid].data>dest)
high=mid-1;
else
low=mid+1;
}
return 0;
}
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,10},i,n=10,dest,R;
Sq S[10];
//对建立的顺序表进行初始化
for(i=0;i<n;i++)
{
S[i].data=a[i];
S[i].number=i+1;
}
printf("请输入要查找位置的数字\n");
scanf("%d",&dest);
R=Reaserch(S,dest,n);
if(R!=0)
printf("%d的位置是:%d\n",dest,R);
else
printf("没有查找的%d的位置\n",dest);
return 0;
}