递归实现折半查找
折半查找顾明思议,就是一半一半的查找,不过前提必须是一个有序的序列,这里我才用了整型数组。
函数必须传入4个参数
int binsearch(int a[], int key, int low, int high)
a[] :要进行查找的数组
key:要进行查找的数值
low:最小下标
high:最大下标
核心思想:
当key值小于数组的中间位置的数值时,就在中间向左边的小数组中继续查找,若大于数组的中间位置的数值时,就在的中间往右边的小数组中继续查找。不过前提,这个数组是由小到大排列的。当然,如果是从大到小排列也不难,就是相反的情况了!
仔细观察,它要在更小的数组中进行查找,一步步深入,这是不是很类似呢?每次都调用同一个函数,只不过数组的大小在缩小,所以我们可以利用递归实现。
不过递归的时候也需要注意,在调用递归函数是一定要加return ,因为我们已经确定值在更小的数组中了,所以这里直接return。
否则如果没有加return,就会出错,最后调用完递归函数后还没有找到想要的值,会一层层出来继续后面的函数,此时就会出现错误!
下面是一个测试代码(这里我默认数组的值时{1,2,3,4,5,6,7,8,9}):
读者可进行Ctrl + C,Ctrl + V测试,如果有错误,请通知我:
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
int binsearch(int a[], int key, int low, int high) {
int i = low;
int j = high;
int mid = (low + high) >> 1;
if (i > j) {
return -1;
}
if (key == a[mid]) {
return mid;
}
else if (key > a[mid]) {
return binsearch(a, key, mid + 1 , j);
}
else {
return binsearch(a, key, i, mid - 1);
}
return -1;
}
int main() {
int a[] = { 1,2,3,4,5,6,7,8,9 };
int i;
printf("请输入你要查找的数字(找到返回下标,否则返回-1):");
scanf_s("%d", &i);
i = binsearch(a, i, 0, 8);
printf("%d\n", i);
system("pause");
return 0;
}