You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++排序与二分查找结合程序异常排查求助

问题分析与解决建议

核心错误:二分查找逻辑错误

你的searchbinary函数里存在致命的条件判断错误:

else if (arr[mid]<1){
    left = mid + 1;
}

这里应该和要查找的目标值x比较,而非固定的1。正确逻辑是:若中间元素小于目标值x,说明目标在右半区间,需调整左边界;反之则调整右边界。

修正后的完整代码

#include <iostream>
using namespace std;

int binarySearch(int arr[], int left, int right, int x) {
    while (left <= right) {
        int mid = left + (right - left) / 2;
        
        if (arr[mid] == x) {
            return mid;
        }
        else if (arr[mid] < x) { // 修正为与目标值x比较
            left = mid + 1;
        }
        else {
            right = mid - 1;
        }
    }
    return -1;
}

int main() {
    int targetNum;
    int numArray[10];
    int searchResult;
    int temp;

    cout << "Enter 10 Numbers: " << endl;
    for (int i = 0; i < 10; i++) {
        cin >> numArray[i];
    }

    // 冒泡排序逻辑正确,无需修改
    for (int i = 0; i < 10; i++) {
        for (int j = i + 1; j < 10; j++) {
            if (numArray[i] > numArray[j]) {           
                temp = numArray[i];
                numArray[i] = numArray[j];
                numArray[j] = temp;
            }
        }
    }   

    cout << "Enter a number from list: ";
    cin >> targetNum;

    searchResult = binarySearch(numArray, 0, 9, targetNum);

    if (searchResult == -1) {
        cout << "Match not Found";
    }
    else {
        // 若要显示从1开始的位置,可改为 searchResult + 1
        cout << "Match Found in Position " << searchResult;
    }

    return 0;
}

额外优化建议

  • 变量命名语义化:将num改为targetNum、darr改为numArray、searchbinary改为binarySearch,提升代码可读性。
  • 替换手动排序:用C++标准库sort函数替代冒泡排序,代码更简洁高效,需先包含头文件<algorithm>:
    sort(numArray, numArray + 10);
    
  • 位置计数调整:用户通常习惯从1开始计数,可将输出语句改为cout << "Match Found in Position " << searchResult + 1;。

内容的提问来源于stack exchange,提问作者Whimo_01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 06:15:39