簡體   English   中英

C ++中具有三個參數的遞歸二分查找

[英]Recursive binary search with three arguments in C++

我正在嘗試正確地進行這種遞歸二分搜索,並且已經走到了這一步。 到目前為止,我可以正確顯示上半部分,但是中間的右側顯示為好像它在左側的位置。 我哪里錯了?

#include <iostream>
using namespace std;

int binarySearch(int array[], int size, int searchValue)
{
    cout << "BST with size = " << size << "[ ";
    for (int i = 0; i < size; ++i){
        cout << array[i] << " ";
    }
    cout << " ]" << endl;

    if (size >= 1)
    {
        int mid = (size - 1) / 2;
        cout << "Mid " << mid << endl;
        if (array[mid] == searchValue)
        {
            return mid;
        }
        if (array[mid] > searchValue)
        {
            return binarySearch(array,  mid, searchValue);
        }
        if (array[mid] < searchValue)
        {
            return binarySearch(array+mid+1, size-(mid + 1), searchValue);
        }
    }
    return -1;
}

int main() {

    int val, myNums[1000];  // Yuck--magic number!
    int pos, cnt = -1;

    cout << "Enter numbers from smallest to largest, 0 to stop\n";
    do {
        cin >> myNums[++cnt];
    } while (myNums[cnt] != 0);

    do {
        cout << "Enter number to search for: ";
        cin >> val;
        if (val != 0) {
            pos = binarySearch(myNums, cnt, val);
            cout << "binarySearch reported " << pos << endl;
        }
    } while (val != 0);

    return 0;
}

這段代碼不正確,有一個非常錯誤的錯誤 - 您試圖獲取某個固定數組中某個值的偏移量,但您確實在此處操作了該數組:

        return binarySearch(**array+mid+1**, size-(mid + 1), searchValue);

你可以清楚地看到這個函數不起作用,因為array+mid+1,如果是mid之后的第一個元素,將返回0,而它應該返回:(int)(size/2)+1

我建議您將“開始”和“結束”范圍變量傳遞給函數。

還有這段文字:

cout << "BST with size = " << size << "[ ";

BST 中的 T 代表“樹”,但您不創建任何樹。

而不是這部分:

if (array[mid] < searchValue)
{
    return binarySearch(array+mid+1, size-(mid + 1), searchValue);
}

您可以使用:

if (array[mid] < searchValue)
{
    int ans = binarySearch(array+mid+1, size-(mid + 1), searchValue);
    if (ans == -1)
        return -1;
    return mid + ans + 1;
}

暫無
暫無

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

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