C语言冒泡排序代码陷入无限循环及打印异常问题排查
修复冒泡排序的sort函数问题
你的sort函数存在两个核心问题:
- 数组越界访问:原代码中
for (i = 0; i < last_i; i++)会导致当i等于last_i - 1时,ptr[i+1]访问数组范围外的内存(数组有效下标是0到N-1),这会引发未定义行为。 - 循环逻辑混乱:
last_i--被放在了for循环的每次迭代里,导致每比较一次就缩小一次排序范围,完全违背了冒泡排序“每轮把最大元素沉到末尾,然后缩小一轮排序范围”的逻辑,这也是引发异常的关键原因。
修复后的sort函数代码:
void sort(int *ptr, int N) { int i = 0; int last_i = N; int temp = 0; // 标志位:判断本轮是否有交换,优化排序效率 int swapped; while (last_i > 1) { swapped = 0; // 每轮只比较到last_i - 2,避免i+1越界 for (i = 0; i < last_i - 1; i++) { if (ptr[i] > ptr[i + 1]) { temp = ptr[i]; ptr[i] = ptr[i + 1]; ptr[i + 1] = temp; swapped = 1; } } // 每轮结束后,最大的元素已经在末尾,缩小排序范围 last_i--; // 如果本轮没有交换,说明数组已经有序,提前退出 if (!swapped) break; } }
改动说明:
- 把
last_i--移到for循环外面,每完成一轮比较后再缩小排序范围,符合冒泡排序的核心逻辑。 - 把for循环的条件改成
i < last_i - 1,确保i+1不会超出数组的有效下标范围。 - 添加了
swapped标志位,当某一轮没有发生任何交换时,说明数组已经完全有序,可以提前终止循环,提升排序效率。
配合你更新后的main函数运行,就能正常输出排序后的整数数组了。
内容的提问来源于stack exchange,提问作者Neronimo
相关产品推荐
相关产品推荐

