学习C语言的时候,折半查找法应该是很多人绕不开的一个简单算法。作为一名C语言的初学者,第一次看这个算法的时候着实是有些头疼。不过仔细读读发现其实并没有想象中那么难。
折半搜索,也称二分搜索是一种在有序数组中查找某一特定元素的搜索算法。
————摘录自百度百科
折半查找的原理很简单,从中间的元素开始,如果恰好等于中间元素,则程序结束;如果特定元素大于(小于)中间元素,则会从大于(小于)中间元素的那一部分重复之前的操作,直至找到或者为空结束。
如果我们想找到中间元素,我们首先设置最低变量low和最高变量high,进行记录最低和最高元素的脚码以便我们去找中间元素。然后设置中间变量min,记录中间变量的脚码。(下面我以一个有15个元素的数组进行演示)
a[0] | a[1] | a[2] | a[3] | a[4] | a[5] | a[6] | a[7] | a[8] | a[9] | a[10] | a[11] | a[12] | a[13] | a[14] |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
low=0 | min=7(low+high)/2 | high=14 |
当特定值大于中间值时:
当特定值小于中间值时:
从上面的过程我们不难看出,当特定值大于中间值时,high变量不变,low变量变成了mid+1;当特定值小于中间值时,low变量不变,high变量变成了mid-1。这一点在我们写程序的时候要时刻注意,不能直接把mid的值赋值给low或者high。
那么,这个查找什么时候结束呢?当我们的low变量的值与high变量的值相等或者大于high变量的时候说明我们没有在数组中找到我们要的特定值。此时,就是程序结束的时候了。
下面,让我们看一道题和它对应的代码来体会下折半查找法吧
题目:
有15个数按从小到大的顺序存放在一个数组中,输入一个数,用折半查找的方法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。
#include <stdio.h>
int main()
{int a[15]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; //特定的数组
int n,low=0,high=14,mid;
printf("请输入想要查找的数:");
scanf("%d",&n); //输入想要查找的特定值
while(low<=high) //程序结束条件
{mid=(low+high)/2;
if(n>a[mid])
low=mid+1; //当特定值大于中间值时
if(n<a[mid])
high=mid-1; //当特定值小于中间值
if(n==a[mid])
{printf("在数组中,是第%d个数",mid+1);
return 0;}}
printf("无此数");
return 0;}
运行结果:
总结 :利用折半查找法我们可以省去一个一个数字进行比较的重复操作从而节省时间。但折半查找也有个很大的缺点就是必须是一个已知长度的有序数组,而且插入删除很困难。同时要注意,在C语言中,数组脚码从”0“开始哦!
作为一个初学者,总结的可能不是很全面,请各位大佬指点。
看到这就给孩子点个赞吧^-^!