二分查找法与我们在孩童时期玩过的猜数的游戏一样,这个游戏里一个朋友会让你猜他正想的一个1至100的数,当你猜了一个数后,他会告诉你三种选择的一个:你猜的比她想的大,或小,或猜中了。为了能用最少的次数猜中,必须从50开始猜,如果她说你猜的太小,则推出那个数在51-100之间,所以下一次猜75((51+100)/2),如果她说有些大,那你就会在51-74之间才,下一次猜(51+74)/2=62。直到猜中她所给的数。

下面给出我们猜1-100的数,key为33的过程:

  java数据结构学习(一)之二分查找_ide

只需7次就可以猜中答案。下面我们给出二分查找的代码:

public class BinarySearch {
    private long[] a;
    private int nelems;
    public BinarySearch(int max){
        a = new long[max];
        nelems = 0;
    }
    //返回数组的长度
    public int size(){
        return nelems;
    }
    /**
     * 二分查找算法关键代码
     * @return
     */
    public int binarySearch(long searchKey){
        int low = 0;
        int high = nelems-1;
        int curIn;
        while(true){
            curIn = (low + high)/2;//划分范围的点
            if(a[curIn] == searchKey){//幸运判断,很幸运正好猜中
                return curIn; //返回要猜的数的位置
            }else if(low > high){//范围不存在
                return nelems;//没找到,返回数组的长度
            }else{
                if(searchKey > a[curIn]){
                    low = curIn + 1;
                }else{
                    high = curIn - 1;
                }
            }
        }
    } 
    
 
    /**
     * 
     * 在有序数组里面插入数
     * @param args
     */
    public void insertOrderArray(long value){
        int i;
        for(i=0;i<nelems;i++){//遍历有序数组里面的元素与插入的数进行比较
            if(a[i] > value){//如果有序数组里面的某一个数比插入的数大,则结束遍历
                break;
            }
        }
        
        //插入的位置i,及i后面到的元素都要向右移动,腾出一个插入位置
        for(int k=nelems;k>i;k--){
            a[k] = a[k-1];//a[10]=a[9],a[9] = a[8]插入点后面的都向右移动一个位置
        }
        a[i] = value;//移动后腾出位置插入要插入的数
        nelems++;
    }
    /**
     * 删除有序数组里面的数
     */
    public boolean delete(long key){
        int i = binarySearch(key);//返回找到的数字数组下标
        if(i==nelems){
            return false;
        }else{
            int j;
            for(j=i;j<nelems;j++){
                a[j] = a[j+1];//向前移动
            }
            nelems--;//数组长度减少
            return true;
            
        }
    }
    /**
     * 显示数组中的数
     */
    public void display(){
        System.out.println("***************");
        for(int j=0;j<nelems;j++){
            System.out.print(a[j]+" ");
            System.out.print("");
        }
    }
    public static void main(String[] args){
        int maxSize = 100;
        BinarySearch arr = new BinarySearch(maxSize);
        arr.insertOrderArray(30);
        arr.insertOrderArray(12);
        arr.insertOrderArray(15);
        arr.insertOrderArray(10);
        arr.insertOrderArray(90);
        arr.insertOrderArray(100);
        arr.insertOrderArray(101);
        arr.insertOrderArray(80);
        System.out.println("##############");
        arr.display();
        long keySearch = 102;
        if(arr.binarySearch(keySearch) != arr.size()){//上面返回值为没找到返回nelems长度
            System.out.println("找到"+keySearch);
        }else{
            System.out.println("没有找到"+keySearch);
        }
        arr.delete(30);
        arr.delete(100);
        arr.display();
    }
}

 

 

 

 

Face your past without regret. Handle your present with confidence.Prepare for future without fear. keep the faith and drop the fear. 面对过去无怨无悔,把握现在充满信心,备战未来无所畏惧。保持信念,克服恐惧!一点一滴的积累,一点一滴的沉淀,学技术需要不断的积淀!