C语言一维数组基数排序失效问题求助
基数排序后数组未变化的常见排查点
检查最大值计算逻辑
基数排序的核心是根据最大值的位数循环处理每一位。如果代码中计算最大值的部分出错(比如误将最大值设为数组第一个元素、遍历数组时遗漏元素),会导致循环轮次为0,排序逻辑根本没执行。示例:// 错误示例:仅取第一个元素作为最大值 int max = arr[0]; // 正确做法:遍历整个数组找最大值 int max = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > max) max = arr[i]; }验证计数排序子过程的正确性
基数排序依赖每一轮的计数排序按当前位排序,这部分最容易出问题:- 计数数组未重置:每处理完一位后,计数数组需要重置为0,否则下一轮的计数会基于上一轮的结果,导致元素无法正确分配。
- 临时数组未写回原数组:如果计数排序后,没有将临时数组的内容复制回原数组,原数组自然不会有变化。
- 当前位计算错误:确保计算当前位的公式正确,即
(arr[i] / exp) % 10,且exp初始为1,每轮循环后乘以10(exp *= 10)。若exp未更新,会一直处理同一位,甚至处理不存在的位。
检查数组操作的有效性
如果基数排序封装在函数中,确认函数参数传递正确:比如在C语言中,数组参数本质是指针,避免在函数中修改原数组的副本而非原数组本身。排查循环边界
确认处理每一位的循环条件正确:循环应持续到exp > max时终止。若循环条件写成exp >= max或其他错误条件,会提前终止循环,导致部分位未处理。
内容的提问来源于stack exchange,提问作者Lvrnnk
相关产品推荐
相关产品推荐

