首页 > 代码库 > 快速排序

快速排序

1.基本思想

     快速排序利用了分治策略。分治策略可以分为3个步骤:

  • 分解:将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小。
  • 解决:递归的求解出子问题。如果子问题的规模足够小,则停止递归,直接求解。
  • 合并:将子问题的解组合成原问题的解。

    对一个典型的子数组A[p..r]进行快速排序的分治过程如下:

  • 分解:数组A[p..r]被划分为两个(可能为空)子数组A[p..q-1]和A[q+1..r],使得A[p..q-1]中的每一个元素都小于等于A[q],而A[q+1..r]中的每个元素都大于A[q]。其中计算下标q也是划分过程的一部分。
  • 解决:通过递归调用快速排序,对子数组A[p..q-1]和A[q+1..r]进行排序。
  • 合并:因为子数组都是原址排序的,所以不需要合并操作。

2.详细过程

    快速排序的伪代码如下:

      image ,为了排序数组A的全部元素,初始调用QUICKSORT(A, 1, A.length)。

 

    其中最关键的部分就是数组的划分PARTITION,它实现了对子数组A[p..r]的原址重排。伪代码如下:

 

      image。  

这里的PARTITION程序选择x=A[r]作为主元,并围绕着它来划分数组。

随着程序的增加,数组被划分成4个区域,如下图所示:

image

其中:

  • A[p..i]上的所有值都小于等于x;
  • A[i+1..j-1]区间的所有值都大于x;
  • A[j..r-1]是还未扫描的元素,可能属于任何一种情况;
  • A[r]=x。

指针 i 一直指向值小数组的最后一个元素,j指向值大数组末尾的下一个元素。所以当A[j]>x时,数值小的部分不用改变。

当当A[j]<=x时,需要将A[j]放到数值小的部分的最后,所以先将i

快速排序