二分查找算法java實現


今天看了一下JDK里面的二分法是實現,覺得有點小問題。二分法的實現有多種今天就給大家分享兩種。一種是遞歸方式的,一種是非遞歸方式的。先來看看一些基礎的東西。

1、算法概念。

二分查找算法也稱為折半搜索、二分搜索,是一種在有序數組中查找某一特定元素的搜索算法請注意這種算法是建立在有序數組基礎上的。

2、算法思想。

①搜素過程從數組的中間元素開始,如果中間元素正好是要查找的元素,則搜素過程結束;

②如果某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,而且跟開始一樣從中間元素開始比較。

③如果在某一步驟數組為空,則代表找不到。

這種搜索算法每一次比較都使搜索范圍縮小一半。

3、實現思路。

①找出位於數組中間的值,並存放在一個變量中(為了下面的說明,變量暫時命名為temp);

②需要找到的key和temp進行比較;

③如果key值大於temp,則把數組中間位置作為下一次計算的起點;重復① ②。

④如果key值小於temp,則把數組中間位置作為下一次計算的終點;重復① ② ③。

⑤如果key值等於temp,則返回數組下標,完成查找。

4、實現代碼。

/**
     * description : 二分查找。
     * @autor kwzhang
     * modify :2012-6-29
     *
     * @param <E>
     * @param array 需要查找的有序數組
     * @param from 起始下標
     * @param to 終止下標
     * @param key 需要查找的關鍵字
     * @return
     * @throws Exception
     */
    public static <E extends Comparable<E>> int binarySearch(E[] array, int from, int to, E key) throws Exception {
        if (from < 0 || to < 0) {
            throw new IllegalArgumentException("params from & length must larger than 0 .");
        }
        if (from <= to) {
            int middle = (from >>> 1) + (to >>> 1); // 右移即除2
            E temp = array[middle];
            if (temp.compareTo(key) > 0) {
                to = middle - 1;
            } else if (temp.compareTo(key) < 0) {
                from = middle + 1;
            } else {
                return middle;
            }
        }
        return binarySearch(array, from, to, key);
    }

5、測試demo很簡單,這里就不寫了。

 

上面這種實現是通過遞歸的方式,各人覺得之類的問題用遞歸比較好理解,而且過程簡單。

下面再來看看非遞歸的方式如何實現。在JDK里面正好有實現,在此就直接貼上Arrays里面的代碼。為了簡單起見,我們就只看看int參數的方法:

  private static int binarySearch0(int[] a, int fromIndex, int toIndex, int key) {
    int low = fromIndex;
    int high = toIndex - 1;
    while (low <= high) {
        int mid = (low + high) >>> 1;
        int midVal = a[mid];
        if (midVal < key)
        low = mid + 1;
        else if (midVal > key)
        high = mid - 1;
        else
        return mid; // key found
    }
    return -(low + 1);  // key not found.
    } 

上面這方法是我直接中SDK里面拷的(我可沒有改動過)。之所以強調這個方法是因為此方法個人覺得有問題的(相信你也會覺得)。

當key為數組a中的最后一個值時,那么就會找不到(不明白sun公司當初是怎么想的)。個人覺得需要把 int high = toIndex - 1; 改成 int high = toIndex;  

 

這個算法到此為止。歡迎討論交流。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM