基于分数排序

时间:2010-12-31 00:09:54

标签: algorithm sorting

我有一个包含一组排名的一维数组。例如

0 | 0
1个| 2个
2个| 2个
3个| 1个
4个| 0
5 | 1

(此处显示的第一列是数组索引)

我希望排名如此

1 | 2
2个| 2个
3个| 1个
5个| 1个
0 | 0
4 | 0

请注意,当存在平局时,索引会按数字递增顺序。我应该考虑采用什么样的算法?

4 个答案:

答案 0 :(得分:5)

正如其他海报所回答的那样,你可能想要一个稳定的分类。稳定的排序算法包括

如果我选择,我可能会选择合并排序,因为它具有最佳的复杂性。插入排序可以在小列表上击败它。我记得有一个案例,冒泡排序并不可怕,但我忘了它是什么。

然而,值得注意的是,担心稳定性会排除像quicksort这样的算法,这可能是您的未指定语言在其排序函数中使用的算法。

无论你使用什么语言,它的排序实现应该能够采用一个函数来比较两个项目并确定哪个是“更大”。所以你真正需要做的就是编写一个

的函数
  • 如果等级相等,则声称具有较大数字指数的项目为“更大”
  • 如果排名不相等,则声称排名较高的项目为“更高”。
  • 如果等级和数字指数相等,则声称它们是相等的。

这只是使用语言附带的任何排序算法按字典顺序对项目进行排序,并且假设如果它们具有相同的索引可以认为两个项目相同,则无需稳定性。

此功能遵循的精确协议因语言而异。

答案 1 :(得分:4)

您正在寻找的是一种“稳定”排序算法,该算法不会重新排序比较相等的元素。您没有说出您正在使用的语言或工具集,因此我无法告诉您具体使用的内容。不稳定性是某些算法的固有特征,其他算法可以以稳定或不稳定的形式实现。通常,如果可能,库排序算法将选择稳定的实现。

答案 2 :(得分:1)

不知道效率有多高,但是:

// suppose you have scores[n]

for c1 = 1 to n
    for c2 = c1 + 1 to n
        if scores[c2]>scores[c1] then swap them

答案 3 :(得分:0)

嗯......这种稳定性很重要吗?

排名不是排序吗?

如果数据除了排名之外还有其他属性,我们最好在比较操作中包含这些属性。

稳定的排序可能会增加复杂性,从而导致不必要的性能损失。