c语言插入排序

问题描述 投票:0回答:1

我是初学者,我想学习插入排序,但在打印时出现错误,代码告诉我:

示例:

entrez la taille du tableau : 5
entrez les elements du tableau : 43
32
1
4
5
votre tableau ressemble a :  43  32  1  4  5 
tableau TRIE:  4  4  1  1  1
--------------------------------
Process exited after 6.303 seconds with return value 5
Press any key to continue . . .
#include<stdio.h>

void triinsertion(int T[],int taille)
{
    int i,j;
        for(i=1;i<taille;i++)
{
    int temp =T[i];
    int j=i-1;
    while(temp>T[j] && j>=0)
    {
        T[j+1]=T[j];
        j--;
    }
    T[j]=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]);
    }
    
    triinsertion(T,taille);
        printf("tableau TRIE: ");

    for (i = 0; i < taille; i++)
    {
        printf(" %d ", T[i]);
    }
}
c insertion-sort
1个回答
0
投票

您的插入排序函数存在两个问题:

  1. while
    条件不会在访问
    j
    之前检查索引T[j]是否有效。它在
    进行访问之后
    这样做了,但为时已晚。如果 j 小于 0,则访问
    T[j]
    会导致未定义的行为。这可能是退出程序的错误,就像您的示例中发生的那样。
    
    

  2. 最后的分配是错误的:
  3. T[j]=temp;

    正在将

    temp
    分配给错误的索引。请注意,
    j
    甚至可能是-1,所以这是没有意义的。您应该分配给
    T[j + 1]
    
    

  4. 不是问题,但你永远不会使用外部定义的
j

,因为你在循环块内再次声明它。

这是更正后的函数:

void triinsertion(int T[], int taille) { for (let i = 1; i < taille; i++) { int temp = T[i]; int j = i - 1; while (j >= 0 && temp > T[j]) { T[j + 1] = T[j]; j--; } T[j + 1] = temp; } }

© www.soinside.com 2019 - 2024. All rights reserved.