计算数组中的排序问题

时间:2019-03-28 19:09:19

标签: c

我正在制定一种计算排序的算法。第一步,我用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;
}

2 个答案:

答案 0 :(得分:1)

在这一行

for(k=n-1;k>=0;k--)

kunsigned,因此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进行任何后处理或单独进行输出数组。