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
相关产品推荐
相关产品推荐

