QuickSort在算法征服阶段实现排序?

Posted

技术标签:

【中文标题】QuickSort在算法征服阶段实现排序?【英文标题】:QuickSort achieves sorting during the conquer stage of algorithm? 【发布时间】:2017-12-30 19:07:09 【问题描述】:

我非常困惑。 其中一个测验问题是“对错,快速排序在算法的征服阶段实现排序”,我选择了正确,因为我记得读过:

快速排序的三个步骤如下:

划分:重新排列元素并将数组拆分为两个子数组和中间的一个元素,这样左子数组中的每个元素都小于或等于中间元素,而右子数组中的每个元素都大于中间元素元素。

征服:递归排序两个子数组。

组合:无。

但是,测验的答案说答案是假的,没有任何解释......

正如教科书所说,QuickSort遵循分治算法,其中征服阶段递归地对两个子数组进行排序,答案不应该是正确的吗?

任何启示将不胜感激。

【问题讨论】:

我投票结束这个问题,因为我认为它属于计算机科学 【参考方案1】:

快速排序选择一个轴,将较小的放在左侧,将较大的放在右侧。

这是您所指的除法步骤。

征服部分是递归地对左右子集执行此操作。

但是,在除法步骤中,元素已经被排序(左侧较小,右侧较大),并且快速排序有效,因为递归这样做可以确保所有内容都在正确的位置。

定义没有错,因为征服在左右重复,但分裂部分是真正分裂和重新排列它们的部分,如前所述。

【讨论】:

别担心!正如下面有人指出的那样,另一种思考方式是,在每个分割步骤中,枢轴都被放置在正确的位置(排序)。希望对您有所帮助! 等于枢轴的值可能会向右或向左交换为小于或大于枢轴的值。将较小的值放在左侧,将较大的值放在右侧会使这些元素更接近其正确位置,因此每个拆分步骤都会增加元素的顺序,直到您达到 2 或 3 个元素,这些元素被移动到正确的位置。与其他一些分而治之的算法不同,对于快速排序,除法后没有合并任何内容。【参考方案2】:

实际上,快速排序是在算法的划分阶段实现排序的。分割数组后,中间元素在它的正确位置,因此你有在每个分割阶段之后排序一个元素

【讨论】:

小于或大于枢轴的值随着每个除法移动到更靠近它们的正确位置,因此在每个除法步骤中排序变得更接近排序。

以上是关于QuickSort在算法征服阶段实现排序?的主要内容,如果未能解决你的问题,请参考以下文章

快速排序(Quicksort)的Javascript实现

快速排序实现(quickSort)

随手编程---快速排序(QuickSort)-Java实现

随手编程---快速排序(QuickSort)-Java实现

排序算法----快速排序(链表形式)

快速排序(QuickSort),归并排序(MergeSort),堆排序(HeapSort)典型C++代码实现总结