二分法

来源:互联网 发布:python 变量类型 编辑:程序博客网 时间:2024/06/07 05:52

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