【发布时间】:2016-12-02 15:15:44
【问题描述】:
我有一个问题。在我阅读 Sedgewick 和 Wayne 的书时,我发现了一些我无法理解的句子。他们写: -“首先,我们做这两个 在处理整个数组之前进行递归调用[他们谈论 MergeSort];在第二种情况下,我们在处理整个数组后进行两次递归调用[他们谈论的是 QuickSort]。” 可能有人向我解释这两个句子的完整概念。 致以最诚挚的问候!
【问题讨论】:
我有一个问题。在我阅读 Sedgewick 和 Wayne 的书时,我发现了一些我无法理解的句子。他们写: -“首先,我们做这两个 在处理整个数组之前进行递归调用[他们谈论 MergeSort];在第二种情况下,我们在处理整个数组后进行两次递归调用[他们谈论的是 QuickSort]。” 可能有人向我解释这两个句子的完整概念。 致以最诚挚的问候!
【问题讨论】:
它指的是在 Merge 和 QuickSort 都使用的分而治之策略中完成工作的顺序。
具体来说,MergeSort 将工作分成更小的块并进行递归调用,然后将两个结果合并在一起。它递归地调用自己在执行合并步骤。
QuickSort 首先找到一个枢轴并通过交换元素执行分区,然后将工作划分为更小的块并进行递归调用。它在执行分区步骤后递归调用自身。
【讨论】:
这些句子不必要地令人困惑。实际上,两种算法的工作方式完全相同:它们 A. 准备要处理的子问题,B. 处理子问题,递归调用 self,以及 C. 将子问题的解决方案组合成完整问题的完整解决方案。
在归并排序中,子问题是通过将输入列表分成两半来准备的。
在快速排序中,它们是通过将输入数组分成两部分来找到的,这些部分包含小于且不小于所选枢轴的值。
mergesort的重组步骤是merging。
快速排序的重组步骤是无操作的,即什么也不做,因为排序是在原地,在同一个数组上完成的。
碰巧对于合并排序,最后一步更为重要,而对于快速排序 - 第一步。
【讨论】: