递归 -- 二分查找程序

原创 2012年03月31日 14:34:18

java数据结构和算法中文第二版

 

递归的二分查找和非递归的二分查找有相同的大O效率:O(logN) ,但是代码简洁,速度可能慢点 。

 

OrdArray.java

package com.ch6.binarySearch;

public class OrdArray {

	private long[] arr ;
	private int nElems ;
	
	public OrdArray(int cnt){
		arr = new long[cnt] ;
		nElems = 0 ;
	}
	
	public int size() {
		return nElems ;
	}
	
	public int find(long key){
		return recFind(key, 0, nElems-1) ;
	}
	
	public int recFind(long key, int lowerBound, int upperBound){
		
		int curIn ;
		curIn = (lowerBound + upperBound ) /2 ;
		if (arr[curIn] == key){  //当前范围的中间即是查询关键字
			return curIn ;
		}else if (lowerBound > upperBound){ //没有找到,即开始下标大于结束下标,返回数组大小
			return nElems ;
		}else{
			if (arr[curIn] < key){ //如果当前范围的中间的值小于关键字 ,则应该在curIn +1 到 upperBound中查找
				return recFind(key, curIn +1, upperBound) ;
			}else{//如果当前范围的中间的值大于关键字 ,则应该在lowerBound 到 curIn -1 中查找
				return recFind(key, lowerBound, curIn -1) ;
			}
		}
	}
	
	public void insert(long key){
		int i ;
		for(i = 0; i < nElems; i++){
			if (arr[i] > key){
				break ;
			}
		}
		for (int j = nElems; j > i; j--){
			arr[j] = arr[j -1] ;
		}
		arr[i] = key ;
		nElems++ ;
		
	}
	
	public void display(){
		for (int i = 0; i < nElems; i++){
			System.out.print( arr[i] + " ") ;
		}
		System.out.println(" ");
	}
}



BinarySearchApp.java

package com.ch6.binarySearch;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BinarySearchApp {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws IOException{

		int maxSize = 100;
		OrdArray ordArr = new OrdArray(maxSize);
		ordArr.insert(19);
		ordArr.insert(72);
		ordArr.insert(33);
		ordArr.insert(45);
		ordArr.insert(68);
		ordArr.insert(53);
		ordArr.insert(100);
		ordArr.insert(30);

		ordArr.display();
		while (true) {
			System.out.print("Enter a number: ") ;
			int key = getInt() ;
			int index = ordArr.find(key);
			if (index != ordArr.size()) {
				System.out.println(key + " is Found , index : " + index);
			} else {
				System.out.println(key + " is not Found.");
			}
		}
	}
	
	public static int getInt() throws IOException{
		
		InputStreamReader isr = new InputStreamReader(System.in) ;
		BufferedReader br = new BufferedReader(isr) ;
		String s = br.readLine() ;
		return Integer.parseInt(s) ;
	}

}




 

运行结果:

19 30 33 45 53 68 72 100 
Enter a number: 19
19 is Found , index : 0
Enter a number: 53
53 is Found , index : 4
Enter a number: 100
100 is Found , index : 7
Enter a number: 2
2 is not Found.
Enter a number:

二分查找递归实现--【编程珠玑】

作者说 有百分之九十的程序员在程序中发现了bug(同时怀疑那些没有发现bug的正确性) 所以尽管二分查找是我们感觉上比较简单的一个程序,但是我们依然不可小视; 首先,假设表中元素是按升序排列,...
  • xjm199
  • xjm199
  • 2014年01月01日 23:35
  • 1161

二分查找递归与非递归总结

二分查找虽然简单,但是很基础,笔试以及面试的命中率很高,因此再次复习,并将易混淆之处指出,以免犯错。 参考:http://blog.163.com/hjzjoy@126/blog/static/53...

简单二分查找和递归的思想

递归是一种重要的编程思想,在学习数据结构时,经常用到递归的思想。就是让函数在一定条件下不断的调用自己,从而求解。思考起来逻辑更为简单,代码更加简洁,但是也容易出现死循环,并且代码的扩展性和可读性不好。...

java实现二分查找(迭代与递归)

二分查找是比较常用也是很高效的一种查找算法,其要求查找数据集的有序,采用顺序存储。在这里使用数组来简单的模拟数据集,并且要求数组升序元素排列,仅仅作为示例使用。如有错误欢迎批评指正。 public ...

递归分治算法之二维数组二分查找(Java版本)

/** * 递归分治算法学习之二维二分查找 * @author Sking 问题描述: 存在一个二维数组T[m][n],每一行元素从左到右递增, 每一列元素从上到下递增,现在需要查找元素X(必在...

二分查找算法的递归、循环实现及其缺陷

关于二分查找法      在学习算法的过程中,我们除了要了解某个算法的基本原理、实现方式,更重要的一个环节是分析算法的复杂度。在时间复杂度和空间复杂度之间,我们又会更注重时间复杂度,往往用牺牲空间换时...

算法(第4版) 学习笔记二——二分查找的普通实现与递归实现

以查找某个特定元素在已排序数组中的索引为例,且此数组为从小到大排序。 算法思路: 1、取第一个索引和最后一个索引代表两个游标,一个lo,一个hi 2、取lo和hi的中间值,即为mid 3、取出中间索引...

【算法】二分查找递归实现

1、算法概念。   二分查找算法也称为折半搜索、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。请注意这种算法是建立在有序数组基础上的。   2、算法思想。   ①搜素过程从...

递归--二分查找/判断奇偶数/汉诺塔问题/POJ放苹果

继续上一篇:这里点击查看上一篇。 题目5:二分查找 使用递归二分查找要注意的就是,数组本身是要有顺序的。代码如下: #include "iostream" using namespace std; ...
  • JSRGFJZ
  • JSRGFJZ
  • 2015年08月01日 08:09
  • 695

极客 - 博文25 - 递归实现二分查找法

递归实现二分查找法
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:递归 -- 二分查找程序
举报原因:
原因补充:

(最多只允许输入30个字)