JAVA 二分查找法-遞歸與非遞歸兩種方式

public int binarySearchV1 (int[] array, int low, int high, int key) {
        if(low > high)
            return -1;
        int mid = low + ((high-low)>>>1);
        if(array[mid]> key){
            return binarySearchV1(array, low, mid -1 , key);
        } else if(array[mid] < key){
            return binarySearchV1(array, mid+1, high, key);
        }else {
            return mid;
        }
    }

    public int binarySearchV2(int[] array, int key){
        int low = 0;
        int high = array.length -1;
        while(low <= high){
            int mid = low + ((high - low)>>>1);
            if (array[mid] > key){
                high = mid -1;
            } else if (array[mid] < key){
                low = mid + 1;
            } else {
                return mid;
            }
        }
        return -1;
    }

    @Test
    public void testBinarySearch(){
        int[] array = {1,3,5,7,9,11};
        int low = 0;
        int high = array.length - 1;
        int key = 9;
        int re = binarySearchV1(array, low, high, key);
        System.out.println(re);
        int re2 = binarySearchV2(array,key);
        System.out.println(re2);
    }

注:

1.思想:

有序的序列,每次都是以序列的中間位置的數來與待查找的關鍵字進行比較,每次縮小一半的查找範圍,直到匹配成功。

2.使用條件:

查找序列是順序結構,有序。

3.int mid = low+((high-low)>>>1);   

//((high-low)>>>1)等價於(high-low)/2;右移一位,相當於除以2,但右移的運算速度更快

//若使用(low+high)/2求中間位置容易溢出,若 low+high > Interger.MAX_VALUE 時,此時會導致數據溢出,則導致mid錯誤,所以 mid 應該改爲 low +(high - low)/ 2;這樣能使得mid的值保持正確。也能方便其他由二分查找法所改的查找法mid公式的記憶。

二分查找法圖示:

 

binary-search

參考地址:

https://blog.csdn.net/maoyuanming0806/article/details/78176957

https://www.cnblogs.com/morethink/p/8379475.html

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