二分查找算法(递归与非递归两种方式)

首先说说二分查找法。

二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标。

采用非递归方式完成二分查找法。java代码如下所示。

	/*
	 * 非递归二分查找算法
	 * 参数:整型数组,需要比较的数.
	 */
	public static int binarySearch(Integer[]srcArray,int des){
		//第一个位置.
		int low=0;
		//最高位置.数组长度-1,因为下标是从0开始的.
		int high=srcArray.length-1;
		//当low"指针"和high不重复的时候.
		while(low<=high){
			//中间位置计算,low+ 最高位置减去最低位置,右移一位,相当于除2.也可以用(high+low)/2
			int middle=low+((high-low)>>1);
		//与最中间的数字进行判断,是否相等,相等的话就返回对应的数组下标.
		if(des==srcArray[middle]){
			return middle;
		//如果小于的话则移动最高层的"指针"
		}else if(des<srcArray[middle]){
			high=middle-1;
		//移动最低的"指针"
		}else{
			low=middle+1;
			}
		}
		return-1;
		}

}

采用递归方式完成二分查找算法。代码如下所示。

	/**
	 * 递归方法实现二分查找法.
	 * @param Array数组
	 * @param low 数组第一位置
	 * @param high 最高
	 * @param key 要查找的值.
	 * @return 返回值.
	 */
	int BinSearch(int Array[],int low,int high,int key)
	{
		if (low<=high)
		{
			int mid = (low+high)/2;
			if(key == Array[mid])
				return mid;
			else if(key<Array[mid])
				//移动low和high
				return BinSearch(Array,low,mid-1,key);
			else if(key>Array[mid])
				return BinSearch(Array,mid+1,high,key);
		}
		else
			return -1;
	}

递归思想会被经常用到,更加突出了编程解决问题的高效。

二分查找算法(递归与非递归两种方式),布布扣,bubuko.com

时间: 2024-10-14 22:10:54

二分查找算法(递归与非递归两种方式)的相关文章

【转】二分查找算法学习札记

说明作者:那谁blog: http://www.cppblog.com/converse转载请注明出处. 二分查找算法基本思想二分查找算法的前置条件是,一个已经排序好的序列(在本篇文章中为了说明问题的方便,假设这个序列是升序排列的),这样在查找所要查找的元素时,首先与序列中间的元素进行比较,如果大于这个元素,就在当前序列的后半部分继续查找,如果小于这个元素,就在当前序列的前半部分继续查找,直到找到相同的元素,或者所查找的序列范围为空为止. 用伪代码来表示, 二分查找算法大致是这个样子的: lef

基础算法介绍 —— 二分查找算法

不知不觉在目前的公司待满3年了,打算回家找份工作.面试中被问到关于算法的题目:有哪些常见的查找算法?下来就把我所掌握的查找算法分享给大家,本文主要介绍二分查找算法. 算法定义(摘自百度):二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好:其缺点是要求待查表为有序表,且插入删除困难.因此,折半查找方法适用于不经常变动而查找频繁的有序列表.首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功:否则利用中间位置记录将表分成前.后两个子表,如果

二分查找算法的递归实现

还有一个典型的递归例子是对已排序数组的二分查找算法.博e百娱乐城 现在有一个已经排序好的数组,要在这个数组中查找一个元素,以确定它是否在这个数组中,很一般的想法是顺序检查每个元素,看它是否与待查找元素相同.这个方法很容易想到,但它的效率不能让人满意,它的复杂度是O(n)的.现在我们来看看递归在这里能不能更有效. 还是考虑上面的两个条件: 第一:这个问题是否可以分解为形式相同但规模更小的问题? 第二:如果存在这样一种分解,那么这种分解是否存在一种简单情境? 考虑条件一:我们可以这样想,如果想把问题

二分查找算法(递归,循环)

二分查找算法是在有序数组中用到的较为频繁的一种算法,在未接触二分查找算法时,最通用的一种做法是,对数组进行遍历,跟每个元素进行比较,其时间为O(n).但二分查找算法则更优,因为其查找时间为O(lgn),譬如数组{1, 2, 3, 4, 5, 6, 7, 8, 9},查找元素6,用二分查找的算法执行的话,其顺序为:    1.第一步查找中间元素,即5,由于5<6,则6必然在5之后的数组元素中,那么就在{6, 7, 8, 9}中查找,    2.寻找{6, 7, 8, 9}的中位数,为7,7>6,

Python——递归、二分查找算法

递归函数 1. 递归 (1)什么是递归:在函数中调用自身函数(2)最大递归深度:默认997/998--是Python从内存角度出发做的限制 n = 0 def story(): global n n+= 1 print(n) story() #997/998 story() (3)修改最大深度:最好不要改--递归次数太多,则不适合用递归解决问题 import sys sys.setrecursionlimit(2000) #1997/1998 2. 递归的优点 会让代码变简单 3. 递归的缺点

一步一步写算法(之非递归排序)

原文:一步一步写算法(之非递归排序) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 在上面一篇博客当中,我们发现普通查找和排序查找的性能差别很大.作为一个100万的数据,如果使用普通的查找方法,那么每一个数据查找平均下来就要几十万次,那么二分法的查找呢,20多次就可以搞定.这中间的差别是非常明显的.既然排序有这么好的效果,那么这篇博客中,我们就对排序算做一个总结. 按照我个人的理解,排序可以分为两种:一种是非递归排序,它主要按照非递归的

全排列算法的递归与非递归实现

全排列算法的递归与非递归实现 全排列算法是常见的算法,用于求一个序列的全排列,本文使用C语言分别用递归与非递归两种方法实现,可以接受元素各不相同的输入序列. 题目来自leetcode: Given a collection of numbers, return all possible permutations. For example, [1,2,3] have the following permutations: [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3

[一个算法] 快速排序的非递归形式实现

fast sort如何实现? 在实际的递归算法当中,我们我们使用一个pivot将数组分为了两部分,然后在分别递归处理这两部分,使用递归先处理左半部分,然后是右半部分,这是用递归可以很容易实现. 但是使用递归的坏处是可能会溢出,当然对于比较良好的分布,即在每一步都能讲数组评分的情况,栈溢出的可能性很小,但是如果不是这种情况,那么就可能会递归很多层,那么这种情况下,算法很容易溢出. 因此将这个算法改为非递归的实现方式,还是非常有意义的.那么问题来了,如何实现非递归的算法? 仔细想想这个算法的过程,会

二叉树遍历算法总结(递归与非递归)

一:前言 二叉树的遍历方法分四种:前序,中序,后序以及层次遍历. 其中,前中后遍历方法的实现分递归和非递归,非递归遍历的实现需要借助于栈. 实际上,递归的调用就是一种栈的实现,所以,非递归遍历就需要人工借助栈结构来实现. 而层次遍历需要借助队列. 二:前中后序遍历 递归遍历: 递归遍历的思想和方法很简单,通过调整输出语句来实现前,中,后三种遍历. 代码如下: 1 void show(BiTree T) 2 { 3 if(T) 4 { 5 printf("%c ",T->data)