折半查找——Java實現


一、查找思想

       折半查找 也稱為二分查找,是一種效率較高的查找方法,查找時要求表中的節點按關鍵字的大小排序,並且要求線性表順序存儲。

  1. 首先用要查找的關鍵字值(key)與中間位置結點的關鍵字值(arr[mid])相比較;
  2. 若比較結果相等,則查找完成;若不相等,再根據要查找的關鍵字值(key)與該中結點關鍵值(mid)的大小來確定下一步在那個子表中進行;
  3. 若待查關鍵值大於中間結點的關鍵字值(key > arr[mid])),則應查找中間結點以后的字表,否則(key < arr[mid])),查找中間結點以前的字表;
  4. 重復步驟1~3,直到找到滿足條件的結點,或者明確表中沒有這樣的結點。

二、圖解

        假設用變量 lowhigh 分別存儲待查元素所在范圍的下界和上界,變量 mid 存儲區間的中間位置,即 mid = [(low + high) / 2]

二分查找-案例

三、代碼實現

public class BinarySearch {
    public static void main(String[] args) {
        int[] arr = {6, 12, 33, 87, 90, 97, 108, 561};

        System.out.println(binarySearch(arr, 90));
        //遞歸查找
        System.out.println(binarySearch(arr, 0, arr.length - 1, 90));
    }

    /**
     * @param arr 待排序列
     * @param key 待查找值
     * @return 待查找值在待排序列中的位置
     */
    private static String binarySearch(int[] arr, int key) {
        int low = 0;
        int high = arr.length - 1;

        while (low <= high) { //必須為 '<=' 否則無法匹配到指定的key;
            int mid = (low + high) / 2;

            if (arr[mid] == key) {
                return "Successful matching [" + (mid + 1) + "]";
            } else if (arr[mid] > key) {
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
        return "Successful matching -1";
    }

    /**
     * 遞歸實現二分查找
     * @param arr 待排序列
     * @param start 待排序列開始值
     * @param end 待排序列結束值
     * @param key 待查找值
     * @return 待查找值在待排序列中的位置
     */
    private static int binarySearch(int[] arr, int start, int end, int key) {

        if (key < arr[start] || key > arr[end] || start > end) { //start > end 不能為'>='
            return -1;
        }

        int mid = (start + end) / 2;
        if (key > arr[mid]) {
            return binarySearch(arr, mid + 1, end, key);
        } else if (key < arr[mid]) {
            return binarySearch(arr, start, mid - 1, key);
        } else {
            return mid + 1;
        }
    }
}


免責聲明!

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



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