首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 折半查找崩潰修復:正確更新 low/high 指標避免邏輯錯誤

     編輯:程式設計疑難解答

錯誤代碼

int half(int number, vector<int> a) {
    int mid = (high - low) / 2;          // 錯誤:未加 low
    if (number > a[mid]) {
        a[low] = a[mid + 1];             // 錯誤:修改陣列內容而非索引
        half(number, a);
    } else if (number < a[mid]) {
        a[high] = a[mid - 1];            // 同上
        half(number, a);
    } else if (number == a[mid]) {
        return 1;
    }
}

問題分析

  1. mid 計算應為 low + (high - low) / 2,防止溢出且正確定位中間。
  2. 二分查找**不修改陣列**,只移動索引邊界 low/high。
  3. 遞歸調用需傳回結果:return half(number, a, low, high);。
  4. 函數簽名應包含 low/high 參數,而非使用全域變數。

正確實現(遞歸版)

int binarySearch(const vector<int>& a, int target, int low, int high) {
    if (low > high) return -1; // 未找到
    int mid = low + (high - low) / 2;
    if (target == a[mid]) return mid;
    if (target < a[mid]) return binarySearch(a, target, low, mid - 1);
    return binarySearch(a, target, mid + 1, high);
}

// 呼叫
int idx = binarySearch(vec, number, 0, vec.size() - 1);

迭代版(更推薦)

int binarySearch(const vector<int>& a, int target) {
    int low = 0, high = (int)a.size() - 1;
    while (low <= high) {
        int mid = low + (high - low) / 2;
        if (target == a[mid]) return mid;
        if (target < a[mid]) high = mid - 1;
        else low = mid + 1;
    }
    return -1;
}

測試建議

邊界測試:空陣列、單元素、目標在首/尾/中間、目標不存在。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved