插入排序程序运行异常:排序结果错误且退出返回值为5
问题排查与修复:插入排序的错误与崩溃问题
核心问题分析
你的代码存在三个关键错误,直接导致排序结果错误和程序崩溃(返回值5是数组越界引发的未定义行为表现):
- 排序逻辑方向颠倒:插入排序实现升序时,需要将比当前元素
temp大的元素向后移动,但你写的判断条件是temp > T[j],这会错误地移动比temp小的元素,完全搞反了排序逻辑。 - 数组越界与赋值位置错误:循环结束后,
j的位置是第一个小于temp的元素索引(或-1),此时应该将temp放到j+1的位置,而不是T[j]——当j=-1时,T[j]会访问数组的负索引,触发未定义行为导致程序崩溃。 - 变量冗余声明:函数开头已经声明了
int i,j;,循环内又重复声明int j = i-1;,虽然语法允许,但会造成变量作用域混淆,属于不必要的冗余。
修复后的完整代码
#include <stdio.h> void triinsertion(int T[], int taille) { int i, j; for (i = 1; i < taille; i++) { int temp = T[i]; j = i - 1; // 修正排序条件:升序需移动比temp大的元素 while (j >= 0 && temp < T[j]) { T[j + 1] = T[j]; j--; } // 修正赋值位置:避免数组越界,插入到正确位置 T[j + 1] = temp; } } int main () { int taille, i; printf("entrez la taille du tableau : "); scanf("%d", &taille); int T[taille]; printf("entrez les elements du tableau : "); for (i = 0; i < taille; i++) { scanf("%d", &T[i]); } printf("votre tableau ressemble a : "); for (i = 0; i < taille; i++) { printf(" %d ", T[i]); } printf("\n"); triinsertion(T, taille); printf("tableau TRIE: "); for (i = 0; i < taille; i++) { printf(" %d ", T[i]); } printf("\n"); }
修复说明
- 修正排序条件:将
temp > T[j]改为temp < T[j],确保升序排序时,仅移动比当前元素大的元素。 - 调整赋值位置:把
T[j] = temp改为T[j+1] = temp,彻底避免数组越界问题,同时保证元素插入到正确的排序位置。 - 简化变量声明:移除循环内的
int j重复声明,直接使用函数开头声明的变量,减少作用域混淆。 - 优化输出格式:添加换行符,让输出结构更清晰易读。
运行修复后的代码,输入示例中的数据,会得到正确的升序结果:1 4 5 32 43,且程序不会再崩溃。
内容的提问来源于stack exchange,提问作者original gamer
相关产品推荐
相关产品推荐

