算法題解:二分查找算法(循環/遞歸)

算法概述

二分搜索,也稱折半搜索、對數搜索,是一種在有序數組中查找某一特定元素的搜索算法。java

搜索過程從數組的中間元素開始,若是中間元素正好是要查找的元素,則搜索過程結束;若是某一特定元素大於或者小於中間元素,則在數組大於或小於中間元素的那一半中查找,並且跟開始同樣從中間元素開始比較。若是在某一步驟數組爲空,則表明找不到。這種搜索算法每一次比較都使搜索範圍縮小一半。算法

二分搜索在狀況下的複雜度是對數時間,進行 O(log n)次比較操做(n在此處是數組的元素數量, O是大O記號, log 是對數)。數組

二分搜索使用常數空間,不管對任何大小的輸入數據,算法使用的空間都是同樣的。除非輸入數據數量不多,不然二分搜索比線性搜索更快,但數組必須事先被排序。code

示例代碼

Java代碼(循環)排序

/**
     * 二分查找(循環)
     * @param arr 數組
     * @param start 頭索引
     * @param end 尾索引
     * @param target 目標
     * @return 目標索引
     */
    public static int binarySearchByRecursion(int[] arr, int start, int end, int target){
        int result = -1;

        while (start <= end){
            int mid = start + (end - start)/2;    //防止溢位
            if (arr[mid] > target)
                end = mid - 1;
            else if (arr[mid] < target)
                start = mid + 1;
            else {
                result = mid ;
                break;
            }
        }
        return result;
    }

Java代碼(遞歸)遞歸

/**
     * 二分查找(遞歸)
     * @param arr 數組
     * @param start 頭索引
     * @param end 尾索引
     * @param target 目標
     * @return 目標索引
     */
    public static int binarySearch(int[] arr, int start, int end, int target){
        if (start > end) {
            return -1;
        }
        int mid = start + (end - start)/2;    //防止溢位
        if (arr[mid] > target) {
            return binarySearch(arr, start, mid - 1, target);
        }
        if (arr[mid] < target)
            return binarySearch(arr, mid + 1, end, target);
        return mid;
    }

複雜度分析

時間複雜度

折半搜索每次把搜索區域減小一半,每次查找的區間大小就是n,n/2,n/2/2,n/2/2/2,簡化爲n/2^k,時間複雜度也就是查找的次數k,最終的區間大小一定爲1,即 n/2^k=1,因此 k=log2 n。(讀做:log以2爲底n的對數)索引

空間複雜度

O(1),常數空間,不管對任何大小的輸入數據,算法使用的空間都是同樣的。get

相關文章
相關標籤/搜索