折半查找算法(C语言实现)
折半查找法基本思路:折半查找的前提条件是对一组已经排过序的数据进行查找,取中间位置的元素与需要查找的数据进行比较。
如果相等,则返回中间元素的下标;如果大于,则从左边的区间查找,与该区域的中值进行比较;如果小于,则从右边的区间查找,与该区域的中值进行比较;
重复上述操作,直到找到目标数据为止,或者已经没有数据可以分区,表示没有找到。每次减少一半的查找范围,提高了查找效率。
如果数组的元素范围分别是 low 和 high,此时的中间元素是
在进行查找时,可以分成以下 3 种情况。
用户输入查找值,调用折半查找函数
声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。
如果相等,则返回中间元素的下标;如果大于,则从左边的区间查找,与该区域的中值进行比较;如果小于,则从右边的区间查找,与该区域的中值进行比较;
重复上述操作,直到找到目标数据为止,或者已经没有数据可以分区,表示没有找到。每次减少一半的查找范围,提高了查找效率。
如果数组的元素范围分别是 low 和 high,此时的中间元素是
(low+high)/2。在进行查找时,可以分成以下 3 种情况。
- 如果查找关键值小于数组的中间元素,关键值在数据数组的前半部分。
- 如果查找关键值大于数组的中间元素,关键值在数据数组的后半部分。
- 如果查找关键值等于数组的中间元素,中间元素就是查找的值。
示例
折半查找。C语言编程代码如下:
#include <stdio.h>
#include <stdlib.h>
#define MAX 21 /*最大数组容量*/
struct element
{ int key;};
typedef struct element record;
record data[MAX]={ 1,3,5,7,9,21,25, 33,46,89,100,121, 127,139,237,279,302,356,455,467,500}; /* 结构数组声明*/
/*折半查找*/
int binarysearch(int key)
{
int low,high,mid; /*数组开始、结束和中间变量*/
low=0; /*数组开始,标记查找下限*/
high=MAX-1; /*数组结束,标记查找上限*/
while(low<=high)
{
mid=(low+high)/2; /*折半查找中间值*/
if(key<data[mid].key) /*当待查找数据小于折半中间值*/
high=mid-1; /*在折半的前一半重新查找*/
else
if(key>data[mid].key) /*当待查找数据大于折半中间值*/
low=mid+1; /*在折半的后一半重新查找*/
else
return mid; /*找到了,返回下标*/
}
return -1; /*没有找到返回-1*/
}
int main()
{
int i,found; /*是否找变量*/
int value; /*查找值*/
printf("已经给出的21个数据为:\n");
for(i=0;i<21;i++)
printf("%d ",data[i]);
printf("\n");
while(1)
{
printf("\n请输入查找值0~500(输入-1结束):");
scanf("%d",&value);
if(value !=-1)
{
found=binarysearch(value); /*调用折半查找*/
if(found!=-1)
printf("找到查找值:%d[第%d个]\n",value,found+1);
else
printf("没有找到查找值:%d\n",value);
}
else
exit(1); /*结束程序*/
}
return 0;
}
运行结果:
已经给出的21个数据为:
1 3 5 7 9 21 25 33 46 89 100 121 127 139 237 279 302 356 455 467 500
请输入查找值0~500(输入-1结束):21
找到查找值:21[第6个]
请输入查找值0~500(输入-1结束):95
没有找到查找值:95
请输入查找值0~500(输入-1结束):-1
用户输入查找值,调用折半查找函数
binarysearch(),以数组的下标居中的元素为中间值,把数组一分为二,根据查找值和中间值的大小关系,决定继续在上半部分还是下半部分查找,然后再次取下标居中的元素为中间值循环判断,直至找到查找值。声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。