c语言实现折半查找算法(二分查找)
实验课上一个题目题目要求使用折半查找算法查找数据,结果一番折腾也没能够实现。下来查了一些资料,第一次写博客就实现一下这个未完成的算法。 折半查找要求数据序列呈现线性结构,也就是经过排序的,假设数据已排序。
算法的操作步骤: 首先需要设3个变量lownum,midnum,highnum,分别保存数组元素的开始,中间和末尾的序号。假定有10个元素,开始时令lownum=0,highnum=9,midnum=(lownum+highnum)/2=4。接着进行以下判断: (1)如果序号为midnum的数组元素的值与x相等,表示查找到了数据,返回该序号midnum。 (2)否则如果x<a[midnum],表示要查找的数据x位于lownum与midnum-1序号之间,不需要再去查找midnum与highnum序号之间的元素。因此,将highnum变量的值改为midnum-1,重新查找lownum与midnum-1(即highnum的新值)之间的数据。 (3)如果x>a[midnum],表示要查找的数据x位于midnum+1与highnum序号之间,不需要再去查找lownum与midnum序号之间的元素。因此,将lownum变量的值改为midnum-1,重新查找midnum-1(即lownum变量的新值)与highnum之间的数据。 (4)逐步循环,如果lownum>highnum时还未找到目标数据x,则表示数据中无此数据。
示例代码:
int search(int a[],int n,int x) //折半查找{ //输入参数a为数据序列数组,n为数组的长度,x为待查找的数据
int mid,low,high;
low=0;
high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==x) //查找到 return mid; //返回
else if(a[mid]>x)
high=mid-1;
else
low=mid+1;
}
return -1; //未查找到
}
内容参考来自《c/c++常用算法手册》