關於快速查找法(折半/二分查找法)解釋(一次記住)binarysearch

簡單說就是折半再折半,很內容理解。

目的:看一次,永遠記住。(媽媽再也不用擔心我不會寫查找了)

難點:low,high操作。

    @Test
    public void binarySearch() {
        //數組一定要是順序的。
        double arr[] = {0.0, 0.001, 0.1, 0.2, 0.3, 0.4, 0.5, 1.0, 2.0, 3.0}
        double key = 0.3;
        int low = 0;
        int high = arr.length - 1;

        while (low <= high) {
            int mid = (low + high) / 2;
            double midVal = arr[mid];

            if (key > midVal)//大在high區,把low往上擡,砍掉low區
                low = mid + 1;
            else if (key < midVal)//小在low區,把high往下壓,砍掉high區
                high = mid - 1;
            else {
                System.out.println(key + "的位置是" + mid); 
                return;//--------找到了退出
            }
        }

        System.out.println(-(low + 1));//沒找到,返回負數
    }

當key大於的midVal的時候說明key在high區

low區的數據就放棄了,怎麼放棄low區?直接把最low的位置指到mid的位置就行了,但還不夠,還要多移一位才行(low=mid+1)。

這樣取值的區間就變成high區的了mid+1的位置到high。然後再折半。這時可能跑過頭了,再往回跑(high=mid-1)就行了。

只要記住key在高區就把low往上擡,key在低區就把high往下壓就行了。(爲什麼要mid+1或者-1,不直接等於mid?因爲mid已經和key比較過了)

核心就是解決low,high的操作,理解了這個操作,快速查找就不是問題。

 

簡單粗暴

如圖:其實就是排除法,不停的幹掉區域,通過不停移動low和high的位置,收縮範圍,最後找到。

mid=(low+high)/2 或者牛逼刺啦帶火花寫成mid=(low+high) >>> 1

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章