Sorting 用于排序的快速排序部件合并排序?
Ques:Mergesort将一个数字列表分成两半,并对这两半进行递归调用。相反,您可以在左半部分执行快速排序,在右半部分执行合并排序吗?如果是,则通过显示每个步骤来显示如何对以下数字列表进行排序。如果没有,请解释为什么不能 我应该用mergesort对数字列表进行排序。使用快速排序对左半部分进行排序的位置 我想出来了。 是的,我们可以Sorting 用于排序的快速排序部件合并排序?,sorting,language-agnostic,quicksort,mergesort,Sorting,Language Agnostic,Quicksort,Mergesort,Ques:Mergesort将一个数字列表分成两半,并对这两半进行递归调用。相反,您可以在左半部分执行快速排序,在右半部分执行合并排序吗?如果是,则通过显示每个步骤来显示如何对以下数字列表进行排序。如果没有,请解释为什么不能 我应该用mergesort对数字列表进行排序。使用快速排序对左半部分进行排序的位置 我想出来了。 是的,我们可以 使用mergesort对数组的右半部分进行排序 使用快速排序对左半部分进行排序 使用Merge_sort的Merge func合并2 是的,你能做到。merge
是的,你能做到。mergesort背后的基本思想如下:
- 对数组的前半部分、剩余部分的前半部分、剩余部分的前半部分等进行快速排序,直到没有剩余的元素
- 然后,从左到右,将最后两个元素合并在一起,然后合并最后四个元素,然后合并最后八个元素,以此类推
这看起来很酷,但是用手做会很痛苦。您最好编写一个这样做的程序,并显示所有中间步骤。:-) 不,你不能这样做。至少如果你还想叫它“合并排序”。合并排序和快速排序之间最根本的区别在于第一个是稳定的算法,即等序元素在排序后保持其相对位置不变。这在许多情况下都很重要。 如果使用“快速排序”对后半部分进行排序,则相等元素的相对位置可能会(而且很可能会)改变。结果集将不会保持稳定性,因此不能仍将其视为合并排序
顺便说一句,关于插入排序作为合并排序的最后一步,前面的答案是正确的。当元素数量较少时,最有效的合并排序实现将使用类似插入排序的方法。插入排序也是稳定的,这就是为什么可以在不破坏合并排序稳定性的情况下进行插入排序。假设您计划在完成后合并“左半部分”和“右半部分”,那么您对每一部分使用哪种排序算法有什么关系(您是否尝试使用就地快速排序来节省空间?)。而且,quicksort和mergesort都可以在C中轻松实现,只需使用一个基指针和序列长度作为参数。创造性的指针算法将以最小的努力消除一个索引(低索引)。我完全有可能误解了你提出的问题,如果是这样,也许可以澄清一下你到底想做什么?我更新了问题。另外,我从你的回复中发现,我可以在排序后合并这两个半部分。非常感谢。