用于排序零件Mergesort的QuickSort?

Ques:Mergesort将数字列表分成两半,并对它们进行递归调用。 相反,你可以在左半边执行快速排序,在右半部分执行快速排序? 如果是,请展示如何通过显示每一步来对以下数字列表进行排序。 如果不是,请解释为什么你不能。

Iam应该使用mergesort对数字列表进行排序。 使用快速排序对左半部分进行排序?

我想到了。 Ans:是的,我们可以

  • 使用mergesort对数组的右半部分进行排序。
  • 使用快速排序对左半边进行排序。
  • 使用merge_sort的合并函数合并2。

  • 是的,你可以做到这一点。 mergesort背后的基本思想如下:

  • 将数组拆分为两个(或更多)部分。
  • 独立分类每件。
  • 应用合并步骤将已排序的块组合到一个整体排序列表中。
  • 从正确性的角度来看,实际上并不关心你如何对第(2)部分生成的列表进行排序。 重要的是这些列表得到排序。 mergesort的一个典型实现通过递归地将它自己应用于左右两半来执行步骤(2),但是没有必要这么做的根本原因。 (事实上​​,在一些优化版本的mergesort中,你特别不要这样做,而是在数组变得足够小时切换到插入排序等算法)。

    在你的情况,你是正确的,左侧使用quicksort和右侧mergesort仍然会产生排序序列。 然而,它的工作方式与你所描述的看起来有很大的不同。 最终会发生的事情是这样的:数组的前半部分会被快速分类(因为你快速排列左半部分),然后你会递归地排序右半部分。 前半部分会被快速分类,然后你会递归排序右半部分。 前半部分会被快速分类,等等。总的来说,这看起来像这样:

  • 您可以快速排列数组的前半部分,然后是剩下的前半部分,然后是剩下的部分的前半部分等,直到没有元素剩下为止。
  • 然后,从左向右工作,你会合并最后两个元素,然后是最后四个元素,然后是最后八个元素等。
  • 这将是一个非常酷的类型,但手动完成将是一个完全痛苦。 你可能最好写一个只是做这个并显示所有中间步骤的程序。 :-)


    不,你做不到。 至少如果你仍然想称之为“合并排序”。 合并排序和快速排序之间最根本的区别在于第一个是稳定的算法,即排序后排序相同的元素保持相对位置不变。 这在很多情况下很重要。 如果您使用快速排序对后半部分进行排序,则相等元素的相对位置可能(并且很可能会改变)。 结果集不会保持稳定性,因此它不能被视为合并排序。

    顺便说一下,以前的答案对于用作合并排序的最后一步的插入排序是正确的。 当元素数量很少时,最有效的合并排序实现将使用类似插入排序的操作。 插入排序也是稳定的,这就是为什么它可以在不破坏合并排序稳定性的情况下完成。

    链接地址: http://www.djcxy.com/p/31585.html

    上一篇: QuickSort for sorting part Mergesort?

    下一篇: Why is my mergesort slower than my quicksort?