Java算法 -- 二分查找

折半查找,要求待查找的序列有序。每次取中間位置的值與待查關鍵字比較,若是中間位置的值比待查關鍵字大,則在前半部分循環這個查找的過程,若是中間位置的值比待查關鍵字小,則在後半部分循環這個查找的過程。直到查找到了爲止,不然序列中沒有待查的關鍵字。java

經過遞歸和非遞歸實現二分查找:code

public class Main {


    public static void main(String[] args) {
        int[] array = {1, 2, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59};
        int position = biSearch(array, 5);
        int position1 = biSearch(array, 1, array.length - 1, 5);
        System.out.println(position);
        System.out.println(position1);
    }

    /**
     * 非遞歸實現二分查找
     *
     * @param array
     * @param array
     * @return
     */
    public static int biSearch(int array[], int key) {
        int low = 0;
        //總長度
        int high = array.length - 1;
        while (low <= high) {
            //中間位置
            int mid = low + (high - low) / 2;
            //若是中間位置的值大於要查找的內容,從左側查找
            if (array[mid] > key)
                high = mid - 1;
            else if (array[mid] < key)
                //若是中間位置的值小於要查找的內容,從右側查找
                low = mid + 1;
            else
                //等於就返回
                return mid;
        }
        return -1;
    }


    /**
     * 遞歸實現二分查找
     *
     * @param array
     * @param low 從哪一個位置開始
     * @param high 到哪一個位置結束
     * @param target 要查詢的值
     * @return
     */
    public static int biSearch(int array[], int low, int high, int target) {
        if (low > high) return -1;
        //中間位置
        int mid = low + (high - low) / 2;
        //中間位置的值大於要查詢的內容,從左側遞歸查詢
        if (array[mid] > target)
            return biSearch(array, low, mid - 1, target);
        if (array[mid] < target)
            //中間位置的值小於要查詢的內容,從右側遞歸查詢
            return biSearch(array, mid + 1, high, target);
        return mid;
    }

}
相關文章
相關標籤/搜索