快速排序是一个分歧&征服方法?

时间:2016-12-28 06:14:35

标签: sorting data-structures language-agnostic quicksort divide-and-conquer

  1. 我认为合并排序是分而治之的,因为,

    分割 - 数组实际上分为子阵列,没有任何处理(比较/交换),问题大小减半/四分之一....

    通过处理(比较/交换)

    征服 - 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
    
  2. 合并排序跟踪说,该问题是粒化的,然后进行处理,

    enter image description here

    1. 但在快速排序中,

      首先,使用分区元素(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);
      
    2. 快速排序跟踪,显示处理在完整阵列上启动,然后达到粒度级别

      enter image description here

      问题:

      1. 我对划分阶段的理解意味着减少(一半)问题的大小。在快速排序中,您是否考虑处理(比较/交换)数组和分区使用数据透视,划分阶段?

      2. 我对征服阶段的理解意味着,收集/合并。在快速排序中,征服阶段意味着什么?

      3.             Note: Am a beginner, in sorting algorithms
        

1 个答案:

答案 0 :(得分:5)

划分&amp;征服算法有3个阶段:

  1. 除,
  2. 征服,
  3. 联合,
  4. 对于合并排序(http://www.cs.umd.edu/~meesh/351/mount/lectures/lect6-divide-conquer-mergesort.pdf):

    1. 除以:将数组拆分为2个子数组,
    2. 征服:合并对递归的子阵列进行合并,
    3. 组合:将两个已排序的子数组合并为一个排序列表。
    4. 快速排序(https://www.cs.rochester.edu/~gildea/csc282/slides/C07-quicksort.pdf):

      1. 划分:首先重新排列然后将数组拆分为2个子阵列,
      2. 征服:递归地对生成的子阵列进行快速排序,
      3. 合并:无。
      4. 注意:感谢罗彻斯特大学和马里兰大学CS系。