1. 程式人生 > 實用技巧 >JAVA兩種實現二分查詢方式

JAVA兩種實現二分查詢方式

二分查詢法適用於 升序排列的陣列,如果你所要操作的陣列不是升序排序的,那麼請用排序演算法,排序一下。

說明:使用二分查詢法相比順序查詢 節約了時間的開銷,但是增加了空間使用。因為需要動態記錄 起始索引和結束索引和中間索引。

順序查詢 平均和最壞情況時間複雜度 :O(n)

二分查詢法 時間複雜度 為 :O(log2n)

package part1;

public class demo01{

    /**
     * 迴圈實現二分查詢
     * @param arr  陣列物件
     * @param x    所要查詢的數
     * @return
     */
    public
static int binarySearch(int[] arr, int x) { int low = 0; int high = arr.length-1; while(low <= high) { int middle = (low + high)/2; //取中間索引 if(x == arr[middle]) { return middle; }else if(x <arr[middle]) { high
= middle - 1; //如果所找的的數小於中間索引對應的值證明所要找的數在左半邊,將中間索引前一位設定為終點索引 }else { low = middle + 1; //如果所找的的數大於中間索引對應的值證明所要找的數在右半邊,將中間索引後一位設定為開始索引 } } return -1; } /** * 遞迴實現二分查詢 * @param dataset 陣列物件 * @param data 所要查詢的數 * @param beginIndex 開始索引 * @param endIndex 結束索引 * @return
*/ public static int binarySearch(int[] dataset,int data,int beginIndex,int endIndex){ int midIndex = (beginIndex+endIndex)/2; //取中間索引 //如果查詢的數小於第一位數 或者 查詢的數大於最後一位數 或者 起始索引大於結束索引 都說明所查詢的數不存在 if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex){ return -1; } //如果查詢的數小於中間索引對應的值說明找的數在左半邊,遞迴呼叫該查詢方法,結束索引為中間索引向左移動一位 if(data <dataset[midIndex]){ return binarySearch(dataset,data,beginIndex,midIndex-1); //如果查詢的數大於於中間索引對應的值說明找的數在右半邊,遞迴呼叫該查詢方法,起始索引為中間索引向右移動一位 }else if(data>dataset[midIndex]){ return binarySearch(dataset,data,midIndex+1,endIndex); //如果所查詢的數正好等於中間索引對應的值,那麼就將該索引返回 }else { return midIndex; } }
  
public static void main(String[] args) { int[] arr = { 11,22,33,44,55,66,77,88}; System.out.println("迴圈查詢:" + (binarySearch(arr, 44) + 1)); System.out.println("遞迴查詢"+(binarySearch(arr,44,0,arr.length-1)+1)); } }