自制冒泡排序代码异常求助:随机输入崩溃,有序输入偶正常
冒泡排序代码崩溃与异常输出的问题修复
你的代码核心问题是数组索引越界,直接导致了随机输入时的崩溃和异常输出:
原代码内层循环中,j从1遍历到N-1,然后使用a[i+j]进行比较。当i的值较大时(比如i=8、j=2),i+j会超过数组a的最大下标(数组长度为10,下标范围是0~9),这会访问数组外的非法内存,导致数据错乱(比如输出中的-1847346713、0这类垃圾值),严重时直接触发程序崩溃。
另外,你的排序逻辑也不符合冒泡排序的核心逻辑——冒泡排序是通过相邻元素的比较与交换,将较大的元素逐步“冒”到数组末尾,而不是用a[i]和a[i+j]跨位置比较。
修复后的代码
#include <stdio.h> int main() { int N=10, max, a[N]; printf("Enter the numbers:"); for(int i=0; i<N; i++) { scanf("%d", &a[i]); } // 输出原始数组 for(int i=0; i<N; i++) { printf("%d,", a[i]); } printf("\n"); // 修正后的冒泡排序逻辑 for(int i=0; i<N-1; i++) { // 每轮排序后,最后i个元素已有序,无需再比较 for(int j=0; j<N-i-1; j++) { // 相邻元素比较,大的往后移 if (a[j] > a[j+1]) { int temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; } } } // 输出排序后的数组 for(int i=0; i<N; i++) { printf("%d,", a[i]); } return 0; }
修复后的运行输出
用你提供的输入测试,会得到正确的排序结果:
Enter the numbers:78 96 78 5 69 3 7 6 9 2 78,96,78,5,69,3,7,6,9,2, 2,3,5,6,7,9,69,78,78,96,
关键修改点
- 内层循环改为遍历到
N-i-1,避免越界,同时利用冒泡排序的特性减少不必要的比较 - 将比较对象改为相邻的
a[j]和a[j+1],符合冒泡排序的核心逻辑 - 外层循环只需执行
N-1次,因为最后一个元素会自动归位
内容的提问来源于stack exchange,提问作者Ashutosh Yadav
相关产品推荐
相关产品推荐

