我认为合并排序是分而治之的,因为,
分割 - 数组实际上分为子阵列,没有任何处理(比较/交换),问题大小减半/四分之一....
通过处理(比较/交换) 征服 - merge()
这些子阵列
代码给人的印象是Divide& Conquer,
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
合并排序跟踪说,该问题是粒化的,然后进行处理,
但在快速排序中,
首先,使用分区元素(pivot)完成数组处理(比较/交换)并修复pivot的最终位置,然后问题大小减半/四分之一/ ....重新分区,
代码不会给人一种分歧的印象。征服,
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
答案 0 :(得分:5)
划分&amp;征服算法有3个阶段:
对于合并排序(http://www.cs.umd.edu/~meesh/351/mount/lectures/lect6-divide-conquer-mergesort.pdf):
快速排序(https://www.cs.rochester.edu/~gildea/csc282/slides/C07-quicksort.pdf):
注意:感谢罗彻斯特大学和马里兰大学CS系。