递归实现折半查找算法(C语言)

递归实现折半查找

折半查找顾明思议,就是一半一半的查找,不过前提必须是一个有序的序列,这里我用了整型数组。

int binsearch(int a[], int key, int low, int high)

a[] :要进行查找的数组
key:要进行查找的数值
low:最小下标
high:最大下标

参数:函数传入4个参数
返回值:找到要查找的值返回对应的下标,未找到返回-1

运行环境: Visual studio 2013
因为运行环境的不同代码可能存在一些编译不通过。
在Visual studio 2013 中需要在scanf语句后加下划线s否则会编译不过
所以代码中我写的是 scanf_s("%d", &i);

不过查找算法是通用的

核心思想:
当key值小于数组的中间位置的数值时,就在中间向左边的小数组中继续查找,若大于数组的中间位置的数值时,就在中间往右边的小数组中继续查找。不过前提,这个数组是由小到大排列的。当然,如果是从大到小排列也不难,就是相反的情况了!
仔细观察,它要在更小的数组中进行查找,一步步深入,这是不是很类似呢?每次都调用同一个函数,只不过数组的大小在缩小,所以我们可以利用递归实现。

不过递归的时候也需要注意,在调用递归函数是一定要加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;
}

运行结果:

在这里插入图片描述

实现折半查找递归算法需要遵循以下步骤: 1.定义一个函数来实现折半查找,并传入需要查找的数组,需要查找的数,数组的左边界和右边界作为参数。 2.检查左边界是否小于等于右边界。如果小于等于,执行以下步骤: 3.计算中间元素的索引。 4.检查中间元素是否等于需要查找的数。如果是,返回中间元素的索引。 5.如果中间元素大于需要查找的数,递归调用函数,并将中间元素的左边作为右边界。 6.如果中间元素小于需要查找的数,递归调用函数,并将中间元素的右边作为左边界。 7.如果左边界大于右边界,则返回-1,表示没有找到。 以下是使用c语言实现折半查找递归算法的示例代码: ```c #include <stdio.h> int midfind(int s[], int x, int left, int right) { if (left <= right) { int mid = (left + right) / 2; if (x < s[mid]) { return midfind(s, x, left, mid - 1); } else if (x > s[mid]) { return midfind(s, x, mid + 1, right); } else { return mid; } } else { return -1; } } int main() { int arr[] = {1, 3, 5, 7, 9}; int len = sizeof(arr) / sizeof(arr); int x = 5; int result = midfind(arr, x, 0, len - 1); if (result == -1) { printf("没有找到%d\n", x); } else { printf("%d在数组中的索引是%d\n", x, result); } return 0; } ``` 上面这段代码中,midfind()函数用于查找需要的数在数组中的索引。首先,检查左边界是否小于等于右边界。如果是,计算中间元素的索引,然后检查中间元素是否等于需要查找的数。如果是,返回中间元素的索引。如果中间元素大于需要查找的数,递归调用函数,并将中间元素的左边作为右边界。如果中间元素小于需要查找的数,递归调用函数,并将中间元素的右边作为左边界。如果左边界大于右边界,则返回-1,表示没有找到。在主函数中,定义一个数组,需要查找的数,数组的长度和结果变量,然后调用midfind()函数来查找需要的数的索引,并输出结果。
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值