包含时间数据的几乎排序列表的有效排序算法?

时间:2012-06-13 14:05:29

标签: c++ algorithm sorting insertion-sort

这个名字说明了一切。我怀疑插入排序是最好的,因为它是一般的大多数排序数据的最佳排序。但是,由于我对数据有了更多了解,因此有可能还有其他种类可供选择。所以其他相关的信息是:

1)这是时间数据,这意味着我可以为数据排序创建有效的哈希值。 2)数据不会同时存在。相反,我将阅读可能包含单个向量,或十几个或数百个向量的记录。我想在5秒钟内输出所有时间。因此,在插入数据时进行排序的排序可能是更好的选择。 3)内存不是一个大问题,但CPU速度是因为这可能是系统的瓶颈。

鉴于这些条件,除了插入排序之外,还有人可以建议一个值得考虑的算法吗?另外,如何定义“主要排序”以确定什么是良好的排序选项?我的意思是我如何查看我的数据并决定'这不像我想象的那样排序,也许插入排序不再是最好的选择'?任何考虑过程复杂性的文章的任何链接都可以理解,该文章可以更好地定义相对于学位数据的复杂性。

由于

编辑: 谢谢大家的信息。我现在将进行简单的插入或合并排序(无论我已经预先编写)。但是,一旦接近优化阶段,我将尝试其他一些方法(因为他们需要付出更多努力才能实现)。我很感激帮助

6 个答案:

答案 0 :(得分:3)

您可以采用您建议的选项(2) - 在插入元素时对数据进行排序。

使用skip list,按时间排序,升序以维护您的数据。

  • 一旦新的主菜到来 - 检查它是否大于最后一个 元素(简单快捷)如果是 - 只需附加它(在跳过列表中很容易)。该 对于这些情况,跳过列表将需要平均添加2个节点,并且将O(1)开启 这些案件的平均值。
  • 如果元素不大于最后一个元素 - 将其添加到 跳过列表作为标准插入操作,它将是O(logn)

此方法将产生O(n+klogn)算法,其中k是无序插入的元素数。

答案 1 :(得分:2)

如果您实施自然版本,我会投入merge sort,如果您遇到任何问题,我会得到O(N)的最佳情况,典型和最差情况为O(N log N)。插入时,您会遇到O(N^2)的最差情况和O(N)的最佳情况。

答案 2 :(得分:2)

您可以在n时间内将kO(n + k lg k)元素列表排除在不合适的位置。

请参阅:http://www.quora.com/How-can-I-quickly-sort-an-array-of-elements-that-is-already-sorted-except-for-a-small-number-of-elements-say-up-to-1-4-of-the-total-whose-positions-are-known/answer/Mark-Gordon-6?share=1

基本理念是:

  • 迭代数组的元素,构建一个递增的子序列(如果当前元素大于或等于子序列的最后一个元素,则将其附加到子序列的末尾。否则,丢弃当前元素和子序列的最后一个元素)。这需要O(n)时间。
  • 由于2k元素不合适,您将丢弃不超过k个元素。
  • 使用2k排序算法(例如合并排序或堆垛)对丢弃的O(k lg k)元素进行排序。
  • 您现在有两个排序列表。在O(n)时间内合并列表,就像在合并排序的合并步骤中一样。

整体时间复杂度= O(n + k lg k)

整体空间复杂度= O(n)

(如果您可以在O(1)空间合并,则可以将其修改为在O(1)空间中投放,但这并非易事)

答案 3 :(得分:1)

如果没有完全理解这个问题,Timsort可能符合您的法案,因为您声称您的数据已经大部分已经排序。

答案 4 :(得分:0)

有许多自适应排序算法专门用于对大多数排序数据进行排序。忽略您存储日期的事实,您可能希望将smoothsort或笛卡尔树排序视为可以对最合理的O(n log n)时间和最佳情况下合理排序的数据进行排序的算法准时。 Smoothsort还具有仅需要O(1)空间的优点,例如插入排序。

使用所有内容都是日期并因此可以转换为整数的事实,您可能希望使用三个中间轴数选择来查看二进制快速排序(MSD基数排序)。该算法具有最佳情况O(n log n)性能,但具有非常低的常数因子,使其具有相当的竞争力。最糟糕的情况是O(n log U),其中U是每个日期的位数(可能是64),这也不错。

希望这有帮助!

答案 5 :(得分:0)

如果您的OS或C库提供了mergesort函数,很可能它已经处理了在O(N)时间内部分排序(在任何方向上)给定数据的情况。

否则,您只需复制您喜欢的BSD操作系统提供的mergesort。