这个名字说明了一切。我怀疑插入排序是最好的,因为它是一般的大多数排序数据的最佳排序。但是,由于我对数据有了更多了解,因此有可能还有其他种类可供选择。所以其他相关的信息是:
1)这是时间数据,这意味着我可以为数据排序创建有效的哈希值。 2)数据不会同时存在。相反,我将阅读可能包含单个向量,或十几个或数百个向量的记录。我想在5秒钟内输出所有时间。因此,在插入数据时进行排序的排序可能是更好的选择。 3)内存不是一个大问题,但CPU速度是因为这可能是系统的瓶颈。
鉴于这些条件,除了插入排序之外,还有人可以建议一个值得考虑的算法吗?另外,如何定义“主要排序”以确定什么是良好的排序选项?我的意思是我如何查看我的数据并决定'这不像我想象的那样排序,也许插入排序不再是最好的选择'?任何考虑过程复杂性的文章的任何链接都可以理解,该文章可以更好地定义相对于学位数据的复杂性。
由于
编辑: 谢谢大家的信息。我现在将进行简单的插入或合并排序(无论我已经预先编写)。但是,一旦接近优化阶段,我将尝试其他一些方法(因为他们需要付出更多努力才能实现)。我很感激帮助
答案 0 :(得分:3)
您可以采用您建议的选项(2) - 在插入元素时对数据进行排序。
使用skip list,按时间排序,升序以维护您的数据。
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
时间内将k
个O(n + k lg k)
元素列表排除在不合适的位置。
基本理念是:
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。