C语言查找数组最接近值函数总返回首元素,如何定位代码错误
问题根因
你参考的示例代码的二分查找逻辑仅适配升序排列的数组,但你替换的数组是降序排列的:{ 2970, 2950, 2930, 2910, 2880, 2860, 2840 },数值从左到右依次减小。
当你输入目标值2900时,第一个边界判断if (target <= arr[0])(2900 <= 2970 结果为真)直接触发,返回了数组第一个元素2970,这就是无论输入什么值只要小于2970都返回第一个元素的原因。
修复方案
方案1:将数组改为升序排列(改动最小,无需修改查找逻辑)
把get_temperature函数里的数组改成从小到大排列即可:
int arr[] = { 2840, 2860, 2880, 2910, 2930, 2950, 2970 };
改完后输入2900就会正常返回2910。
方案2:修改查找逻辑适配降序数组
如果要保留当前降序数组的写法,需要调整getNearestElement的判断逻辑:
- 翻转前两个边界判断的条件
- 二分查找分支的大小判断对应翻转
同时建议给差值计算加绝对值,避免负数导致的判断错误,修改后的代码如下:
static int getNearest(int x, int y, int target) { if (abs(target - x) >= abs(target - y)) return y; else return x; } static int getNearestElement(int arr[], int n, int target) { // 降序数组:比第一个元素大就直接返回第一个 if (target >= arr[0]){ return arr[0]; } // 降序数组:比最后一个元素小就直接返回最后一个 if (target <= arr[n - 1]){ return arr[n - 1]; } int left = 0, right = n, mid = 0; while (left < right) { mid = (left + right) / 2; if (arr[mid] == target){ return arr[mid]; } // 降序数组:目标比当前mid值大,往左侧查找 if (target > arr[mid]) { if (mid > 0 && target < arr[mid - 1]){ return getNearest(arr[mid - 1], arr[mid], target); } right = mid; } // 降序数组:目标比当前mid值小,往右侧查找 else { if (mid < n - 1 && target > arr[mid + 1]){ return getNearest(arr[mid], arr[mid + 1], target); } left = mid + 1; } } return arr[mid]; }
内容的提问来源于stack exchange,提问作者TheBestPlayer
相关产品推荐
相关产品推荐

