如何有效地排序有序序列的数组

时间:2011-02-06 09:52:54

标签: algorithm sorting sequences

我正在实现复杂的算法,其中一部分是对有序数字序列的数组进行排序。整个算法应该是 nlog(n)复杂度,所以这部分应该相同或更好,但我不知道如何做到这一点。

有一个例子。有一系列序列:

(0)
(0,1)
(0)
(0,5)
(2,4)
()
(0,5)
()
(2,4)
(1,3,4)

并且最终排序应该是:

()
()
(0)
(0)
(0,1)
(0,5)
(0,5)
(1,3,4)
(2,4)
(2,4)

有一些重要的注意事项:

  • 排序是词典的
  • 序列是有序的,但不保证连续性
  • 还有空序列
  • 有很多相同的序列
  • 序列从0到数百长,不再是
  • 数组可以是100k长,可能不再是
  • 最终实现将使用C ++,但现在可能不太重要

你能告诉我如何排序它的最好方法吗?非常感谢

3 个答案:

答案 0 :(得分:2)

你的问题似乎与radix sort类似,在这种情况下,如果没有这样的项目,首先按最右边的项目排序(例如第100项),将其设置为min possible value - 1(例如在案例中)我可以看到-1),然后用第二个最右边的项目对这个排序的序列进行排序,并继续这种方式。

此外,如果序列中的项目都在1..k之间(在这种情况下我可以看到介于1..9之间)使用counting sort在O(n)中对它们进行排序,如果可以使用计数sort,排序时间为O(n),但排序时间为O(n log n)。

答案 1 :(得分:1)

如果使用quicksort,则排序算法将为O(n log n)。如何比较这两个项目与排序本身的复杂性无关,并且有其自身的复杂性(可能是O(m))。

答案 2 :(得分:0)

如果您可以将GPLv3代码集成到项目中,GNU Sort可能是一个很好的起点。至少,当我在你的样本输入上运行它时,我得到了你的样本输出,所以它不会立即出错。