二分查找法適用於 升序排列的數組,如果你所要操作的數組不是升序排序的,那么請用排序算法,排序一下。
說明:使用二分查找法相比順序查找 節約了時間的開銷,但是增加了空間使用。因為需要動態記錄 起始索引和結束索引和中間索引。
順序查找 平均和最壞情況時間復雜度 :O(n)
二分查找法 時間復雜度 為 :O(log2n)
package part1; /** * Created by Administrator on 2018/7/31. */ public class demo01{ /* * 循環實現二分查找算法arr 已排好序的數組x 需要查找的數-1 無法查到數據 */ /** * * @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)); } }