Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 用于排序的快速排序部件合并排序?_Sorting_Language Agnostic_Quicksort_Mergesort - Fatal编程技术网

Sorting 用于排序的快速排序部件合并排序?

Sorting 用于排序的快速排序部件合并排序?,sorting,language-agnostic,quicksort,mergesort,Sorting,Language Agnostic,Quicksort,Mergesort,Ques:Mergesort将一个数字列表分成两半,并对这两半进行递归调用。相反,您可以在左半部分执行快速排序,在右半部分执行合并排序吗?如果是,则通过显示每个步骤来显示如何对以下数字列表进行排序。如果没有,请解释为什么不能 我应该用mergesort对数字列表进行排序。使用快速排序对左半部分进行排序的位置 我想出来了。 是的,我们可以 使用mergesort对数组的右半部分进行排序 使用快速排序对左半部分进行排序 使用Merge_sort的Merge func合并2 是的,你能做到。merge

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

我应该用mergesort对数字列表进行排序。使用快速排序对左半部分进行排序的位置

我想出来了。 是的,我们可以

  • 使用mergesort对数组的右半部分进行排序
  • 使用快速排序对左半部分进行排序
  • 使用Merge_sort的Merge func合并2

  • 是的,你能做到。mergesort背后的基本思想如下:

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

    在您的情况下,使用左侧的快速排序和右侧的合并排序仍然会生成排序序列,这是正确的。然而,它的工作方式看起来与您描述的完全不同。最终会发生这样的情况:数组的前半部分将进行快速排序(因为您对左半部分进行快速排序),然后对右半部分进行递归排序。前半部分将快速排序,然后递归地对右半部分排序。前半部分将进行快速排序,等等。总的来说,这看起来像这样:

    • 对数组的前半部分、剩余部分的前半部分、剩余部分的前半部分等进行快速排序,直到没有剩余的元素
    • 然后,从左到右,将最后两个元素合并在一起,然后合并最后四个元素,然后合并最后八个元素,以此类推

    这看起来很酷,但是用手做会很痛苦。您最好编写一个这样做的程序,并显示所有中间步骤。:-)

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


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

    假设您计划在完成后合并“左半部分”和“右半部分”,那么您对每一部分使用哪种排序算法有什么关系(您是否尝试使用就地快速排序来节省空间?)。而且,quicksort和mergesort都可以在C中轻松实现,只需使用一个基指针和序列长度作为参数。创造性的指针算法将以最小的努力消除一个索引(低索引)。我完全有可能误解了你提出的问题,如果是这样,也许可以澄清一下你到底想做什么?我更新了问题。另外,我从你的回复中发现,我可以在排序后合并这两个半部分。非常感谢。