二分法

1、核心算法

 

public class OrdArray {

	private long[] a;
	private int nElems;
	
	public OrdArray(int max){
		a = new long[max];
		nElems = 0;
	}
	
	public int size(){
		return nElems;
	}
	
	/**
	 * 寻找值
	 * @param searchKey
	 * @return
	 */
	public int find(long searchKey){
		return recFind(searchKey, 0, nElems-1);
	}
	
	/**
	 * 递归调用,二分法寻找值
	 * @param searchKey
	 * @param lowerBound
	 * @param upperBound
	 * @return
	 */
	private int recFind(long searchKey, int lowerBound, int upperBound){
		int curIn;
		
		curIn = (lowerBound + upperBound)/2;//获取中间值
		if(a[curIn] == searchKey){//寻找到值,返回
			return curIn;
		}else if(lowerBound > upperBound){//寻找不导致,自身大小
			return nElems;
		}else{//寻找不到值
			if(a[curIn] < searchKey){//小于,再到小的区间二分寻找
				return recFind(searchKey, curIn+1, upperBound);
			}else{//大于,到大于的空间二分寻找
				return recFind(searchKey, lowerBound, curIn-1);
			}
		}
	}
	
	/**
	 * 插入
	 * @param value
	 */
	public void insert(long value){
		int j;
		//寻找值比插入之大的位置
		for(j = 0; j< nElems; j++){
			if(a[j]> value){
				break;
			}
		}
		//比插入值大的值向右移位
		for(int k = nElems; k>j ; k--){
			a[k] = a[k-1];
		}
		a[j] = value;
		nElems ++;
	}
	
	/**
	 * 展示
	 */
	public void display(){
		for(int i = 0; i< nElems; i++){
			System.out.print(a[i] + " ");
		}
		System.out.println(" ");
	}
}



 

2、测试代码:

 

public class BinarySearchApp {

	public static void main(String[] args){
		//初始化
		int maxSize = 100;
		OrdArray arr;
		arr = new OrdArray(maxSize);
		//插入
		arr.insert(72);
		arr.insert(90);
		arr.insert(45);
		arr.insert(126);
		arr.insert(54);
		arr.insert(99);
		arr.insert(144);
		arr.insert(27);
		arr.insert(135);
		arr.insert(81);
		arr.insert(18);
		arr.insert(108);
		arr.insert(9);
		arr.insert(117);
		arr.insert(63);
		arr.insert(36);
		//展示列表
		arr.display();
		//查找
		int searchKey = 666;//指定查找值
		if(arr.find(searchKey) != arr.size()){
			System.out.println("Found " + searchKey);
		}else{
			System.out.println("Can't find "+ searchKey);
		}
		
	}
}

 

 

3、结果:

9 18 27 36 45 54 63 72 81 90 99 108 117 126 135 144  
Can't find 666
===========================
9 18 27 36 45 54 63 72 81 90 99 108 117 126 135 144  
Found 99



Reference:

[1]  Robert Lalore(著) 计晓云,赵研,曾希,狄小菡(译), Java数据结构和算法(第二版),中国电力出版社,2004 :200-204

 

posted @ 2017-08-28 17:52  ryelqy  阅读(135)  评论(0编辑  收藏  举报