我是初学者,我想学习插入排序,但在打印时出现错误,代码告诉我:
示例:
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]);
}
}
您的插入排序函数存在两个问题:
while
条件不会在访问j
之前检查索引T[j]
是否有效。它在进行访问之后这样做了,但为时已晚。如果
j
小于 0,则访问 T[j]
会导致未定义的行为。这可能是退出程序的错误,就像您的示例中发生的那样。
T[j]=temp;
正在将
temp
分配给错误的索引。请注意,j
甚至可能是-1,所以这是没有意义的。您应该分配给 T[j + 1]
。
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;
}
}