C语言二分查找首次出现位置函数调试:代码为何无法正常运行?
你的二分查找函数的问题分析
你的代码存在两个核心逻辑错误,导致无法正确找到元素首次出现的位置:
指针变量更新错误
你在判断a[mid] < x和a[mid] > x时,错误地修改了mid变量,而非调整二分查找的边界指针:- 当
a[mid] < x时,目标元素应该在右半区间,需要把low设为mid + 1,而不是mid = low + 1 - 当
a[mid] > x时,目标元素应该在左半区间,需要把high设为mid - 1,而不是mid = high - 1
- 当
多分支逻辑冲突
三个if语句是独立执行的,比如第一个if修改mid后,后续if会基于修改后的mid重新判断,导致逻辑混乱。必须用else if串联条件,确保每次循环只会执行一个分支的逻辑。
修正后的代码
int firstOcc(int a[], int m, int x) { int high = m - 1, low = 0, mid, index = -1; while (low <= high) { mid = low + (high - low) / 2; // 避免low+high溢出的安全写法 if (a[mid] < x) { low = mid + 1; } else if (a[mid] > x) { high = mid - 1; } else { // 找到目标后,继续向左搜索更早出现的位置 index = mid; high = mid - 1; } } return index; }
内容的提问来源于stack exchange,提问作者Baseel Kayal
相关产品推荐
相关产品推荐

