Algorithm 我们应该把这两份清单排序,然后合并,还是反过来?

Algorithm 我们应该把这两份清单排序,然后合并,还是反过来?,algorithm,Algorithm,如果我有两个数字列表,为了能够得到一个单独的排序列表,我应该先对单个数字进行排序,然后进行合并排序,还是应该将两个列表合并为一个列表,然后应用有效的排序算法?如果它们还没有排序,我会将它们合并并进行单独排序。如果将它们分开排序然后进行合并排序更有效,那么最有效的排序算法就是这样构建的:任意将列表一分为二,分开排序然后合并。但事实并非如此,因此……如果它们还没有被排序,我会将它们组合起来,然后进行单一排序。如果将它们分开排序然后进行合并排序更有效,那么最有效的排序算法就是这样构建的:任意将列表一分

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

如果它们还没有排序,我会将它们合并并进行单独排序。如果将它们分开排序然后进行合并排序更有效,那么最有效的排序算法就是这样构建的:任意将列表一分为二,分开排序然后合并。但事实并非如此,因此……

如果它们还没有被排序,我会将它们组合起来,然后进行单一排序。如果将它们分开排序然后进行合并排序更有效,那么最有效的排序算法就是这样构建的:任意将列表一分为二,分开排序然后合并。但事实并非如此,因此……

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

列表A和B的选项为:

  • 排序(A和B)
  • 合并(排序(A),排序(B))
  • 如果A和B都是近似排序且大小相似的,那么在近似排序的列表上快速执行某些操作(如插入排序)可以同时在这两个列表上执行。然后进行合并,这需要线性时间,使选项(2)接近线性。但是在这种情况下,如果每个列表中的值的范围相似,那么选项(1)将一点也不好,留给您的可能是O(n log n),假设您的值不适合基数或计数排序。也就是说,对于许多排序算法,较长的列表会造成伤害,因为数据移动的距离较长

    现在,我们可能会提出方案(1)更好的情况

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

    但是,正如所有关于“哪种排序方法更好”的问题一样,您确实必须看看:

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

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

    您可以通过任何一种方式进行论证;这取决于许多因素:

    列表A和B的选项为:

  • 排序(A和B)
  • 合并(排序(A),排序(B))
  • 如果A和B都是近似排序且大小相似的,那么在近似排序的列表上快速执行某些操作(如插入排序)可以同时在这两个列表上执行。然后进行合并,这需要线性时间,使选项(2)接近线性。但是在这种情况下,如果每个列表中的值的范围相似,那么选项(1)将一点也不好,留给您的可能是O(n log n),假设您的值不适合基数或计数排序。也就是说,对于许多排序算法,较长的列表会造成伤害,因为数据移动的距离较长

    现在,我们可能会提出方案(1)更好的情况

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

    但是,正如所有关于“哪种排序方法更好”的问题一样,您确实必须看看:

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

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

    为什么这是标记机器学习?拆分为两个列表是最有效的排序算法工作的方式;-)为什么这是标记机器学习?分成两个列表是最有效的排序算法工作的方式;-)最有效的排序算法(合并排序、快速排序)就是这样构建的。希普索尔是个例外。你在想什么算法?插入排序?对于几乎排序的数据,这可能很快,但最坏情况下的效率很差(O(n^2))。最有效的排序算法(mergesort,quicksort)就是这样构建的。希普索尔是个例外。你在想什么算法?插入排序?这在几乎排序的数据上可能很快,但最坏情况下的效率很差(O(n^2))。我能想到的唯一一种情况是,如果A的几乎所有元素都小于B的几乎所有元素,并且您使用了类似插入排序的算法,它在几乎排序的输入上表现良好。但是在这种情况下,InsertionSortTime(A concat B)所需的时间大约与InsertionSortTime(A)+InsertionSortTime(B)一样长,因此改进只是一个不变的因素:合并两个列表和串联两个列表之间的差异(两者都是O(n)操作,但合并也需要O(n)比较)。+1我还认为(2)是“几乎总是”更好。合并对元素顺序不敏感,因此当排序不是O(n)时,比如计数和基数,通常情况下,较小列表上的排序应该首先有帮助。我能想到的唯一一种情况是,如果A的几乎所有元素都小于n,那么(1)会更好