首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数组中的计数排序问题

数组中的计数排序问题
EN

Stack Overflow用户
提问于 2019-03-29 03:09:19
回答 2查看 38关注 0票数 0

我正在做一个计算排序的算法。在第一步中,我用0初始化了第二个数组。其次,我统计了第二个for循环中元素的频率。在第三个循环中,我尝试对数组进行排序。第三个循环不会在代码块中运行。此外,它没有给我正确排序的第三个循环的result.Any问题。因为它将数组更改为1-1-2-0-2-2-0-1-1,所以应该是0-0-0-1-1-1-1-2-2-2

代码语言:javascript
运行
复制
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;
}
EN

回答 2

Stack Overflow用户

发布于 2019-03-29 03:15:21

在这条线上

代码语言:javascript
运行
复制
for(k=n-1;k>=0;k--)

kunsigned,因此k >= 0始终为true。当一个unsigned整数小于零时,它的值就会“换行”。

此外,您的排序循环不会对任何内容进行排序。它不能,因为没有比较。你可能想回顾一下你的算法。

票数 1
EN

Stack Overflow用户

发布于 2019-03-29 07:11:54

问题(除了在另一个答案中提到的循环条件错误之外)是这似乎是两种不兼容的计数排序方法的组合。

“向后遍历输入数组,将每个元素插入到输出数组中的适当位置”方法需要单独的输出数组。考虑一下对{2, 1}进行排序的简单情况:如果我们将1复制到同一数组中的适当位置,它将变成{1, 1},这将是我们的最终输出。相反,为了不覆盖2,需要将1放入单独数组的适当插槽中。

此外,这种方法要求我们对count数组进行第二次传递,以将其语义含义从“具有值n的元素的计数”更改为“具有值的第一个元素的索引> n”。这是通过将到目前为止的总数与count的每个元素相加来实现的(因此,在您的示例中,count将从{3, 4, 3}转到{3, 7, 10})。在这一步之后,count[n] - 1是输出数组中应该放置下一个n的索引。

考虑到您正在对整数进行排序,第二种(更简单的)方法也是可能的:一旦您完成了对输入数组的初始遍历,count将保存您需要的所有信息,因此您可以自由地覆盖输入数组。只需从头开始,插入count[0] 0s,count[1] 1s等。这种方法不需要对count或任何单独的输出数组进行任何后处理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55405200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档