You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

插入排序程序运行异常:排序结果错误且退出返回值为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");
}

修复说明

  1. 修正排序条件:将temp > T[j]改为temp < T[j],确保升序排序时,仅移动比当前元素大的元素。
  2. 调整赋值位置:把T[j] = temp改为T[j+1] = temp,彻底避免数组越界问题,同时保证元素插入到正确的排序位置。
  3. 简化变量声明:移除循环内的int j重复声明,直接使用函数开头声明的变量,减少作用域混淆。
  4. 优化输出格式:添加换行符,让输出结构更清晰易读。

运行修复后的代码,输入示例中的数据,会得到正确的升序结果:1 4 5 32 43,且程序不会再崩溃。

内容的提问来源于stack exchange,提问作者original gamer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:29:52