java兩種實現二分查找方式


二分查找法適用於 升序排列的數組,如果你所要操作的數組不是升序排序的,那么請用排序算法,排序一下。

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

順序查找  平均和最壞情況時間復雜度 :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));
    }
}

 


免責聲明!

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



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