CS50x 2020 Find作业check50测试报程序退出超时问题排查
问题根因定位
你遇到的测试超时、死循环问题,完全出在search函数的二分查找实现上,sort函数的选择排序逻辑没有问题。
- 核心错误:你将
middle(数组中间索引)的计算放在了while循环外部,仅在函数启动时计算一次。后续循环中你不断更新minimum、maximum的边界值,但从未根据新的边界重新计算middle的取值,导致循环逻辑卡死。
举个实际触发死循环的例子:对长度为4的有序数组
[1, 3, 5, 7]查找值7时:
- 初始计算得到
middle=1(对应数组值3)- 判定7>3,将
minimum更新为2,计算剩余元素数n=7-2+1=2- 由于
middle从未更新,下一轮循环依然取values[1]=3和7对比,再次触发“把minimum设为2”的逻辑,n始终卡在2,循环永远不会退出,最终触发测试超时。
修正方法
- 将
middle的计算逻辑移入while循环内部,每次更新完边界后,基于当前的minimum、maximum重新计算中间索引
修正后的核心代码逻辑参考:
bool search(int value, int values[], int n) { if (n < 0) { return false; } int minimum = 0, maximum = n - 1; while (n > 0) { // 每次循环根据当前边界重新计算中间索引 int middle = (maximum - minimum) / 2 + minimum; if (value == values[middle]) { return true; } else if (value > values[middle]) { minimum = middle + 1; } else if (value < values[middle]) { maximum = middle - 1; } n = maximum - minimum + 1; } return false; }
内容的提问来源于stack exchange,提问作者koby
相关产品推荐
相关产品推荐

