【发布时间】:2017-05-12 09:38:45
【问题描述】:
-
我认为归并排序是分而治之的,因为,
划分 - 数组按字面意思划分为子数组不做任何处理(比较/交换),问题大小减半/四分/....
征服 -
处理这些子数组merge()通过处理(比较/交换)代码给人的印象是分而治之,
if(hi <= lo) return; int mid = lo + (hi-lo)/2; //No (compare/swap) on elements before divide sort(a, aux, lo, mid); // Problem is halved(Divide) sort(a, aux, mid+1, hi); merge(a, aux, lo, mid); // (Compare/swap) happens here during Merge - Conquer
Merge sort trace 说,这个问题被细化然后处理,
-
但在快速排序中,
首先,使用分区元素(pivot)处理(比较/交换)完整数组并固定枢轴的最终位置,然后问题大小减半/ Quartered/.... 用于重新分区,
代码不会给人一种分而治之的印象,
if(hi <= lo) return; int j = partition(a, lo, hi); // Do you call this divide phase? sort(a, lo, j-1); // This looks like divide phase, because problem is halved sort(a, j+1, hi);
快速排序跟踪,显示处理是在完整数组上开始的,然后达到粒度级别,
问题:
我对划分阶段的理解意味着,减少(一半)问题规模。在快速排序中,您是否将使用枢轴处理(比较/交换)数组和分区作为划分阶段?
我对征服阶段的理解意味着,收集/合并回来。在快速排序中,征服阶段是什么意思?
Note: Am a beginner, in sorting algorithms
【问题讨论】:
-
也许添加
language-agnostic标签?? -
@JosephWood 我添加了 C 语法
-
Wiki 在divide and conquer algorithms 的部分列表中包含快速排序,但正如您所指出的,在快速排序的情况下,在除法发生之前对当前数组或子数组完成了一些工作.在除法产生两个大小为 1 的子数组之前,纯归并排序不会进行任何合并。自下而上的归并排序跳过递归并开始将大小为 n 的数组划分为大小为 1 的 n 个子数组。这是一个问题术语。
-
如果你认为划分的过程必须是零成本,那么快速排序并不是零成本进行划分,也不是分而治之。但是,AFAIK,除法并非总是期望为零成本,我认为快速排序是一种分而治之的算法。
-
@JonathanLeffler 我对 divide 的理解是,问题大小减半,仅此而已(无比较/交换)。处理或不处理问题减半,是不太严重的一点。在给定的语法中,
partition(a, lo, hi)与 Mergesort 中的sort(a, aux, lo, mid);不同,在快速排序中问题的一半
标签: sorting data-structures language-agnostic quicksort divide-and-conquer