已按降序排序的数组如何求相邻元素最大差值?C代码问题求解
问题分析与代码修正
原代码存在3处核心错误:
- 变量
i未初始化就被用于计算初始max值,此时i为随机值,访问a[i]属于非法内存访问,会触发未定义行为 - for循环边界设置错误,循环条件为
i < n时,当i = n-1,i+1 = n超出数组合法下标范围(数组下标区间为0~n-1),会出现数组越界访问 abs函数的括号位置错误,原代码abs(a[i + 1] - a[i] > max)是对「差值是否大于max」的布尔判断结果取绝对值,逻辑完全错误,应该先对差值取绝对值再和max比较
修正后代码
void dif(int a[], int n) { // 边界处理:数组元素少于2个时无相邻差值 if (n < 2) { printf("0\n"); return; } int i, max; // 初始化i为0,取第一组相邻元素差值作为初始max i = 0; max = abs(a[i + 1] - a[i]); // 循环边界调整为i < n-1,避免i+1越界 for (i = 0; i < n - 1; i++) { // 修正abs括号位置,先计算差值取绝对值再比较 if (abs(a[i + 1] - a[i]) > max) { max = abs(a[i + 1] - a[i]); } } printf("%d\n", max); }
可选优化
因为你已经提前将数组按降序排序,前一个元素必然大于等于后一个元素,相邻差值为非负数,可以直接去掉abs调用,用a[i] - a[i+1]计算差值即可,减少不必要的计算开销。
内容的提问来源于stack exchange,提问作者Waz
相关产品推荐
相关产品推荐

