递归、非递归方式实现二分(折半)查找

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40818798/article/details/86513523

递归:函数自己调用自己

二分(折半)查找:在一个有序的列表中,要查找某值X。

  • 每次取该列表最中间位置的值M待查找值X进行比较。

  • X>M,说明待找值X可能在右半区间(大的区间——这取决于列表是从小到大还是从大到小,假设此时列表从小到大排列)内;

  • X<M,说明待找值X可能在左半区间内;

  • 故可将列表范围缩小为一个仅有原来一半大小的区间内重复操作。

  • 若最终有X=M,则说明查找成功;

  • 若当low>high时,仍然未找到,则说明查找失败


C语言递归版

#include<stdio.h>

int bin_find_dg(int* test, int low, int high,int find)
{
	int mid = (low +  high) / 2;

	if (low > high)
		return -1;
	else if (find == *(test + mid))
		return mid;
	else if (find < *(test + mid))
	{
		high = mid - 1;
		bin_find_dg(test, low, high, find);
	}
	else if (find > *(test + mid))
	{
		low = mid + 1;
		bin_find_dg(test, low, high, find);
	}
}

int main()
{
	int test[9] = { 1,2,3,4,5,6,7,8,9 };
	int temp = bin_find_dg(test, 0, 8, -4);
	if( -1==temp )
		printf("Not Find!");
	else
		printf("Find it:%d!",temp);
	return 0;
}

C语言非递归版

int bin_find_fdg(int* test, int low, int high, int find)
{
	int mid;
	while (low <= high)
	{
		mid = (low + high) / 2;
		if (find == *(test + mid))
			return mid;
		else if (find < *(test + mid))
			high = mid - 1;
		else if (find > *(test + mid))
			low = mid + 1;
	}
	return -1;
}

int main()
{
	int test[9] = { 1,2,3,4,5,6,7,8,9 };
	int temp = bin_find_fdg(test, 0, 8, 9);
	if( -1==temp )
		printf("Not Find!");
	else
		printf("Find it! Location:%d!",temp);
	return 0;
}

Python非递归版 

def binary_search(list, item):
    low = 0
    high = len(list) - 1
    while low <= high:
        mid = (low + high)
        guess = list[mid]
        if guess == item:
            return mid
        if guess > item:
            high = mid - 1
        else:
            low = mid + 1
    return None

my_list = [1, 3, 5, 7, 9]
print( binary_search(my_list, 3) ) # => 1
print( binary_search(my_list, -1) )# => None

猜你喜欢

转载自blog.csdn.net/qq_40818798/article/details/86513523
今日推荐