首页 > 其他 > 详细

二分查找法

时间:2017-02-09 00:38:20      阅读:138      评论:0      收藏:0      [点我收藏+]

当使用二分查找时就体现出排序的重要性,这种查找比线性查找要快很多,尤其是对较大的数据来说更为显著。

二分查找类似猜数字的游戏,一个朋友让你才她正在想的一个1到100之间的数。当你猜了一个数后,她会告诉你三种情况:你猜的数比她想的大,或小,或猜中了。于是,你从50开始猜,如果她说你猜的数比较小,那么她的数在51-100,否则,在1-49。这样每猜一次,可能的值就会划分为两部分,最后范围会缩小到一个数字,即最后答案。

下面是二分查找法的Java实现:

public int BinarySearch(long searchKey){
    int low = 0; 
    int high = n - 1;
    int mid;
    
    while(true){
        mid = (low + high) / 2;  //初始值
        if (a[mid] == searchKey)  //找到
            return mid;
        else if (low > high)  //寻找完毕,没有找到
            return n;
        else{
            if (a[mid] < searchKey)  //在上半部分
                low = mid + 1;
            else
                high = mid - 1;  //在下半部分
        }
    }
}

现在,运用以上的二分查找法来实现一个包含该方法的有序数组类:

public OrdArray{
    private long[] a;
    private int nElems;
    
    public OrdArray(int max){
        a = new long[max];
        nElems = 0;
    }
    
    public int size(){
        return nElems;
    }
    
    public int find(long searchKey){
        int lowerBound = 0;
        int upperBound = nElems -1;
        int curIn;
        
        while (true){
            curIn = (lowerBound + upperBound) / 2;
            if (a[curIn] == searchKey)
                return curIn;
            else if (lowerBound > upperBound)
                return nElems;
            else {
                if (a[curIn] < searchKey)
                    lowerBound = curIn + 1;
                else
                    upperBound = curIn - 1;
            }
        }
    }
    
    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--)  //j之后的向右移位
            a[k] = a[k - 1];
        a[j] = value;  //插入
        nElems++;
    }
    
    public boolean delete(long value){
        int j = find(value);  //调用二分查找的方法
        if (j == nElems)  //没有找到
            return false;
        else {
            for (int k = j; k < nElems; k++)  //向左移位
                a[k] = a[k+1];
            nElems--;
            return true;
        }
    }
    
    public void display(){
        for (int j = 0; j < nElems; j++)
            System.out.println(a[j] + " ");
    }
}

 

二分查找法

原文:http://www.cnblogs.com/lahwf/p/6380390.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!