引言:
在某个群内看到有位同学分享了这道题。由此来分享我的做法思路;
递归折半顺序查找算法介绍:
简单来说,这个的实现要求之一就是要在一个有顺序的一组数中查找你要求寻找的元素的位置;
首先会输入一个元素个数n 以及 你要求查找的 元素 m;
之后输入的是 n 个有顺序的数列;
然后就是实现 折半查找 :先是将 m 与这一组数的中间的元素进行对比;
这样后就会产生两种情况:
1.m 大于 中间的元素 ,然后我们就可以折半,将后半部分的元素做为新的一组数来进行这一新一组的数的中间值进行判断,然后这样无限递归下去后就可以查找到这一数
2.m小于中间的元素,然后后面的步骤跟上面的步骤差不多;
ok 当然有部分同学可能没看懂,那来看看code的实现:
#include <stdio.h>
int main()
{
int num[999];
int m, n, i;
int j;
int serch(int* num, int key, int high, int low);
printf("请输入有序元素个数:");
scanf_s("%d", &n);
printf("请输入查找元素:");
scanf_s("%d", &m);
for (i = 0; i < n; i++)
{
scanf_s("%d", &num[i]);
}
j = serch(num, m, n, 0);
if (j != -1)
printf("元素位置为:%d", j);
else
printf("不存在这一数字。");
return 0;
}
int serch(int num[], int key, int high, int low)
{
int mid = (high + low) / 2;
if (high < low)
return -1;
if (num[mid] == key)
{
return mid;
}
if (key < num[mid])
{
return serch(num, key, mid - 1, 0);
}
else
return serch(num, key, mid + 1, high);
return -1;
}
为了实现递归,我们要自定义一个函数,来实现输入数组的利用和关键字的查找;
int serch(int num[], int key, int high, int low)
加上
if (high < low)
return -1;
这个就是为了在不存在这一数的情况下实现正确的反馈,之所以这么做是因为:
在多次递归后同时key没得到匹配 那么mid - 1 以及 mid +1 的值会发生大于high处 获得的值(high在递归处变化要以所处位置做意义解释,不要认为就是最高位);
ps:另外scanf_s的使用是因为vs2019报错的原因,使用其他ide报错scanf_s,就改成scanf就行了;
##如果对你有帮助的话,可以点个赞以及收藏与关注,有关于递归学习的题型我会持续给大家更新;
##另外如果有错的话,欢迎大佬提出错误,我会很快更改和纠正;
这里有个对递归的讲解,大家感兴趣的话,可以看看:用阶乘实现对递归以及静态变量的理解(以及%g的解释)