排序算法之二:快速排序
2015-05-13 10:23
113 查看
1、快速排序的描述
像合并排序一样,快速排序也是基于分支模式的,下面是对一个典型子数组A[p..r]排序的分支过程的三个步骤:(1)分解:使用下标q,用A[q]将数组A[p..r]划分为两个子数组(A[p..q-1]和A[q+1..r]),其中A[p..q-1]中的所有元素都小于等于A[q],A[q+1..r]中的所有元素都大于等于A[q],q通过划分过程求得;
(2)解决:递归调用快速排序,对分解得到的两个子数组进行排序;
(3)合并:因为两个子数组是就地排序的,所以递归之后得到的A[p..r]就是已排好序的数组。
2、算法
QUICKSORT(A,p,r) if p<r then q = PARTITION(A,p,r) QUICKSORT(A,p,q-1) QUICKSORT(A,q+1,r)
排序一个完整的数组A,最初调用的是QUICKSORT(A,1,length[A]).
数组划分是快速排序算法的关键,数组划分算法如下:
PARTITION(A,p,r) x=A[r] i=p-1 for j=p to r-1 do if A[j]<=x then i=i+1 exchange(A[i],A[j]) exchange(A[i+1],A[r]) return i+1
PARTITION(A,p,r) x=A[r] i=p-1 for j=p to r-1 do if A[j]<=x then exchange(A[++i],A[j]) exchange(A[++i],A[r]) return i
数组划分算法参照下图会很容易理解,只要时刻记住i指向的是<=x的子数组的最后一个元素,而j指向的是待被划分子数组的第一个元素,该算法就比较easy啦。
3、算法实例
(1)动态演示过程:图2 快速排序示意图
(2)算法实例:
图3 快速排序实例
相关文章推荐
- 【算法-排序之二】快速排序
- 【算法-排序之二】快速排序
- Algorithms - 排序算法之二:快速排序
- 【重温经典算法之二】快速排序
- 【算法-排序之二】快速排序
- 算法导论4:快速排序 2016.1.4
- [算法入门]快速排序非递归方法(Java实现),大家一起来找茬啊~
- 算法——快速排序
- 常用的选择排序.Shell排序.快速排序.冒泡排序.插入排序的算法
- 《算法》实验一归并排序与快速排序 时间的比较
- 【排序及算法】冒泡/选择/插入/快速排序、顺序查找/折半查找算法
- 第十六周项目1--验证算法--(4)快速排序
- 第十六周项目1-验证算法(4)快速排序
- 基于比较的算法之四:快速排序
- 白话算法 快速排序
- (转)白话经典算法系列之六 快速排序 快速搞定
- 坐在马桶上看算法:快速排序
- 快速排序的递归实现算法
- 快速排序(迭代算法)
- 算法与数据结构——快速排序 Quick Sort