递归算法实现二分查找

 目录

原二分查找代码

递归二分查找代码


本文简单介绍二分查找的递归算法。

对一个有序的列表通过按中间元素切分搜索空间进行快速查找的,也可以通过递归方法实现。

虽然该算法实际应用中较少,但其中的递归思路大家可以熟悉一下,为学习数据结构中树的相关内容作一个铺垫。前后代码都简单易懂,因而不作过多的赘述,诸位读者直接阅读代码即可。唯一的点在于,递归算法中找不到的情况“return -1”的书写位置和条件需要注意。

本文的呈现想法和下面这篇文章相同,作为开拓思路、加深对递归函数的理解而为之。其实很多基础的算法,包括斐波那契数列、闰年等,都可以用递归实现。递归思路能将复杂的问题呈现以简单的思路,这是它的优势。通过简单问题的递归实现,大家可以提前熟悉递归的构造和运用,为后续学习数据结构“树”的相关内容作铺垫。

递归实现素数判断http://t.csdn.cn/Jgrhc

原二分查找代码

int binarySearch(int* arr,int left,int right,int key){
	while(left <= right){
		int mid = (left+right)/2;
		if(key > arr[mid]){
			left = mid + 1;
		}else if(key < arr[mid]){
			right = mid - 1;
		}else{
			return mid;
		}
	}
	return -1;
}

递归二分查找代码

思路:将迭代换为递归

1. 找重复(规模更小)

每次重复的过程均为:判断目标数字key与中间元素arr[mid]的大小 --> 缩小范围

2. 找变化(确定参数)

变化的量始终是查找范围的边界(left和right),将它们写入递归函数的参数列表。

3. 找出口

当找到目标数字时,递归函数开始返回值mid,因而条件即为 key == arr[mid]

int binarySearch(int* arr,int left,int right,int key){

	if(left > right){
		return -1;
	}
	int mid = (left+right)/2;
	if(key > arr[mid]){
		//left = mid + 1;
		binarySearch(arr,mid + 1,right,key);
	}else if(key < arr[mid]){
		//right = mid - 1;
		binarySearch(arr,left,mid-1,key);
	}else if(key == arr[mid]){
		return mid;
	}	
}

时间复杂度与空间复杂度均为O(logN)

 

  • 16
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值