我们应该对两个列表进行排序然后合并,还是以其他方式进行组合?

时间:2012-08-04 06:46:57

标签: algorithm

如果我有两个数字列表,为了能够获得单个排序列表,我应该首先对各个列表进行排序然后进行合并排序,还是应该将两个列表合并为一个列表然后应用有效的排序算法?

2 个答案:

答案 0 :(得分:3)

你可以用任何一种方式论证;这取决于很多因素:

列表A和B的选项是:

  1. sort(A concat B)
  2. 合并(排序(A),排序(B))
  3. 如果A和B的大小几乎都是有序的,那么就可以在两者上做一些在几乎排序的列表上快速工作的东西,比如插入排序。然后你进行合并,这需要线性时间,使选项(2)接近线性。但在这种情况下,如果每个列表中的值范围相似,则选项(1)将不会很好,留下一些可能为O(n log n)的东西,假设您的值不适合基数或计数分类。也就是说,对于许多排序算法,较长的列表会因为数据移动距离较长而受到损害。

    现在我们可能会提出选项(1)更好的案例。

    但是,如果您发现选项(2)在您的情况下总是更好,那么意味着您应该天真地应用递归拆分和合并方法,因为这样做会产生开销。

    但是,正如所有关于“哪种排序方法更好”的问题一样,你真的要看一下:

    • 列表的大小
    • 列表中值的范围(最小值,最大值)(因为O(n)排序可以在某些情况下使用)
    • 它们是近乎排序,几乎是反向排序,完全随机还是其他什么
    • 允许,禁止外部存储器等。
    • 无论是在内存中排序还是排序文件
    • 列表大小是相同还是一个比另一个长得多。

    简而言之,“它取决于”,但如果列表已经拆分并且您的排序算法对列表长度敏感,那么您可以从选项(2)中获得一些好处。

答案 1 :(得分:0)

如果它们尚未排序,我只需将它们组合起来进行一次排序。如果单独对它们进行排序然后进行合并排序更有效,那么最有效的排序算法将以这种方式构建:任意将列表拆分为两个,单独排序并合并。但事实并非如此,那就是.......