我有一个包含一组排名的一维数组。例如
0 | 0
1个| 2个
2个| 2个
3个| 1个
4个| 0
5 | 1
(此处显示的第一列是数组索引)
我希望排名如此
1 | 2
2个| 2个
3个| 1个
5个| 1个
0 | 0
4 | 0
请注意,当存在平局时,索引会按数字递增顺序。我应该考虑采用什么样的算法?
答案 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)
排名不是排序吗?
如果数据除了排名之外还有其他属性,我们最好在比较操作中包含这些属性。
稳定的排序可能会增加复杂性,从而导致不必要的性能损失。