我目前正在尝试在C中制作数组排序器;但它不起作用,我真的不明白为什么,所以我请你帮忙。
for(j=0;j<taille;j++){
for(i=j; i<taille -1;i++ ){
imin = j;
nbmin = tableau[j];
if (tableau[i+1]<nbmin){
imin = i+1; // on stocke l'indice de la plus petite variable
nbmin = tableau[i+1]; // on stocke la plus petite variable dans une variable intermédiaire
}
tableau[imin] = tableau[j]; // prend la dernière case non triée pour la mettre à l'endroit de la plus petite case du tableau
tableau[j] = nbmin; // la dernière case non triée contient la plus petite valeur non triée -> la cse est donc triée
}
}
感谢您的帮助!
答案 0 :(得分:1)
在外循环的每次迭代中,您需要确定子数组[j ... taille]
的最小元素并将其复制到前面。您使用的算法很简单:
i
上的内部循环是列表中的第二项,但在您的实现中,初始化和交换发生在该循环内。
您的代码应如下所示:
for(j = 0; j < taille; j++) {
int imin = j; // initialise minimum
int nbmin = tableau[j];
for(i = j + 1; i < taille; i++) { // find minimum
if (tableau[i] < nbmin) {
imin = i;
nbmin = tableau[i];
}
}
tableau[imin] = tableau[j]; // swap elements
tableau[j] = nbmin;
}
(我还改变了内部索引,因此您可以查看元素tableau[i]
而不是元素tableau[i + 1]
,我觉得这更自然。我已经做了变量描述外循环的最小局部。)
答案 1 :(得分:1)
我想你想使用Selection Sort(wiki page)。
想法是找到每个传递中的最小项目并将其放在适当的位置。
这是一个代码片段,可以为您提供相关信息。跳过变量声明和swap
例程。
for (i = 0; i < n - 1; i++)
{
min_index = i;
for (j = i + 1; j < n; j++)
if (array[j] < array[min_index])
min_index = j;
if (min_index != i)
swap(array[i], array[min_index]);
}