C语言实现Count Sort时排序不完整 后续结果全部输出0
计数排序代码问题修复方案
核心问题原因
你的代码存在两处直接导致输出异常的逻辑错误:
- 计数数组初始化范围错误
count_sort_calculate_counts函数中,计数数组count_array的下标对应待排序元素的取值,需要初始化所有取值范围的位置,而不是仅初始化和输入数组长度等量的前N位。 - 输出写入时遍历计数数组的范围错误
count_sort_write_output_array函数的外层循环是遍历所有可能的待排序取值,上限应该是最大待排序值,而非输入/输出数组的长度,这是导致你仅前几位输出正常、后续全为0的直接原因:大于当前循环上限的数值计数完全没有被写入输出数组,输出数组剩余未赋值的位置默认就是0。
另外全局定义的循环变量i、j、k存在重入冲突隐患,建议改为函数内局部变量。
修复后代码
int MAX_LAENGE = 1000; int MAX_VALUE = 100; void count_sort_calculate_counts(int input_array[], int len, int count_array[]) { // 修复:初始化所有取值对应的计数数组位置 for (int i = 0; i <= MAX_VALUE; i++) { count_array[i] = 0; } for (int j = 0; j < len; j++) { count_array[input_array[j]] = count_array[input_array[j]] + 1; } } void count_sort_write_output_array(int output_array[], int len, int count_array[]) { int k = 0; // 修复:遍历所有可能的取值,而非输出数组长度 for (int j = 0; j <= MAX_VALUE; j++) { for (int i = 0; i < count_array[j]; i++) { output_array[k] = j; k = k + 1; } } }
额外注意事项
- 需保证输入的待排序元素取值不超过
MAX_VALUE,否则会出现数组越界访问问题 - 计数数组的定义长度需要为
MAX_VALUE + 1,避免下标越界
内容的提问来源于stack exchange,提问作者WOLOLOMyChild
相关产品推荐
相关产品推荐

