我正在制定一种计算排序的算法。第一步,我用0初始化了第二个数组。其次,我计算了第二个for循环中元素的频率。在第三循环中,我试图对数组进行排序。第三个循环不在代码块中运行。而且它也没有给我正确的排序结果。第三循环的任何问题。由于它将数组更改为1-1-2-0-2-2-0-1-1,而应为0-0-0-1-1-1-1-2-2-2
printf("Hello world!\n");
unsigned m=3;
unsigned n=10;
unsigned x;
unsigned k;
unsigned data[10] = {0, 2, 1, 1, 0, 2, 2, 0, 1, 1};
unsigned *count;
count =(unsigned *)malloc(sizeof(unsigned)*m);
int y=sizeof(data);
for(int i=0;i<m;i++)
{
count[i]=0;
}
for(int j=0;j<n;j++)
{
x=data[j];
count[x]++;
}
for(k=n-1;k>=0;k--)
{
data[count[data[k]]-1]=data[k];
count[data[k]]=count[data[k]]-1;
}
for(int i=0;i<n;i++)
{
printf("%d \n",data[i]);
}
return 0;
}
答案 0 :(得分:1)
在这一行
for(k=n-1;k>=0;k--)
k
为unsigned
,因此k >= 0
始终为true。当unsigned
整数小于零时,其值将“换行”。
此外,您的排序循环不对任何内容进行排序。不能,因为没有比较。您可能想查看一下算法。
答案 1 :(得分:0)
问题(除了另一个答案中提到的循环条件错误外)是,这似乎是两种不兼容的计数排序方法的组合。
“向后遍历输入数组,将每个元素插入输出数组中的适当位置”方法需要一个单独的输出数组。考虑对{2, 1}
进行排序的简单情况:如果将1
复制到同一数组中的适当插槽中,它将变为{1, 1}
,最终将成为我们的最终输出。相反,需要将1
放在单独数组的适当插槽中,以免覆盖2
。
此外,此方法还要求我们对count
数组进行第二遍处理,以将其语义从“具有值n
的元素数”更改为“具有值> {的第一个元素的索引” {1}}”。这可以通过将到目前为止的总数加到n
的每个元素中来完成(因此,在您的情况下,count
将从count
变为{3, 4, 3}
)。完成此步骤后,{3, 7, 10}
是输出数组中下一个count[n] - 1
应放置的索引。
鉴于您正在对整数进行排序,第二种(更简便的)方法也是可行的:完成对输入数组的初始遍历后,n
将保留您需要的所有信息,因此您可以自由地覆盖输入数组。只需从头开始,然后插入count
count[0]
,0
count[1]
等,此方法不需要对1
进行任何后处理或单独进行输出数组。