首页 > 代码库 > 快速排序
快速排序
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.详细过程
快速排序的伪代码如下:
,为了排序数组A的全部元素,初始调用QUICKSORT(A, 1, A.length)。
其中最关键的部分就是数组的划分PARTITION,它实现了对子数组A[p..r]的原址重排。伪代码如下:
。
这里的PARTITION程序选择x=A[r]作为主元,并围绕着它来划分数组。
随着程序的增加,数组被划分成4个区域,如下图所示:
其中:
- 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
快速排序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。