簡體   English   中英

二分查找算法的正確方法

[英]Correct way of Binary Search Algorithm

我剛剛了解了二分搜索算法,並嘗試實現它。 我已經使用了一些測試用例,它似乎工作正常。 但是,當我查看 GeeksforGeeks 時,他們處理索引的方式有很多不同。 任何人都可以闡明我的實施是否良好。 如果沒有,它怎么會失效?

這是我的代碼:

static int binarySearch(int arr[], int i, int r, int x) {

    if(r > 1) {
        int middle = r/2;

        if(arr[middle] == x) {
            return middle;
        }

        if(arr[middle] > x) {
            return binarySearch(arr, i, middle, x);
        }else {
            return binarySearch(arr, middle, r+1, x);
        }
    }       

    return -1;
}

假設我們的 function 將對子arr[l..r] (包括)進行二分搜索。 在這里, r - l + 1是此子陣列的長度,當它不是正數時(或r < l )並返回 -1。

你知道,我們總是制作兩個(幾乎)等長的子數組。 所以, middle = r/2是不正確的, middle = (l + r) / 2是正確的。 新的子數組是arr[l..middle-1]arr[middle+1..r] 我們在檢查子數組的中間元素后划分子數組,所以這兩個子數組不應該包含中間索引,如您所見。

現在,我們可以重寫您的代碼。

static int binarySearch(int arr[], int l, int r, int x) {
    if (r >= l) {
        int middle = (l + r) / 2; //int middle = l + (r - l) / 2; for avoiding integer overflow
        if(arr[middle] == x)
            return middle;
        if (arr[middle] > x)
            return binarySearch(arr, l, middle - 1, x);
        else
            return binarySearch(arr, middle + 1, r, x);
    }       
    return -1;
}

這是二進制搜索算法的非遞歸版本。 通常,它可以工作得稍微快一些。

static int binarySearch2(int arr[], int l, int r, int x) {
    while (r >= l) {
        int middle = (l + r) / 2; //int middle = l + (r - l) / 2; for avoiding integer overflow
        if (arr[middle] == x)
            return middle;
        if (arr[middle] > x)
            r = middle - 1;
        else
            l = middle + 1;
    }
    return -1;
}

在調用這些函數之前不要忘記對數組進行排序。 假設n是給定數組的長度。 對於從 0 開始的 arrays,調用函數的正確形式是:

binarySearch(arr, 0, n - 1, x);

binarySearch2(arr, 0, n - 1, x);

對於基於 1 的 arrays,調用函數的正確形式是:

binarySearch(arr, 1, n, x);

binarySearch2(arr, 1, n, x);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM