快速排序
2014-04-25 15:32
302 查看
1. 问题描述
2. 算法思想
跟归并排序类似,快速排序也是基于分而治之的思想。对典型子数组
进行排序的分治过程如下:
分解:数组
被划分成两个(可能为空)的子数组
和
,使得
。下标
在划分过程中得到。
解决:通过递归调用快速排序,对子数组
和
排序。
合并:不需要进行任何操作。因为两个子数组是就地排序的,将它们合并不需要操作:整个数组
已排序。
3. 伪代码实现
快速排序:
快速排序的随机化版本:
4. C++实现
快速排序:
快速排序的随机化版本:
5. 算法复杂度分析
时间复杂度:
空间复杂度:
快速排序在系统内部需要一个栈来实现递归。若每次划分较为均匀,则其递归树的高度为
,故递归后需栈空间(即空间复杂度)为
;最坏情况下,递归树的高度为
,所需的栈空间(即空间复杂度)为
。
快速排序为不稳定排序算法。
2. 算法思想
跟归并排序类似,快速排序也是基于分而治之的思想。对典型子数组
进行排序的分治过程如下:
分解:数组
被划分成两个(可能为空)的子数组
和
,使得
。下标
在划分过程中得到。
解决:通过递归调用快速排序,对子数组
和
排序。
合并:不需要进行任何操作。因为两个子数组是就地排序的,将它们合并不需要操作:整个数组
已排序。
3. 伪代码实现
快速排序:
快速排序的随机化版本:
4. C++实现
快速排序:
快速排序的随机化版本:
5. 算法复杂度分析
时间复杂度:
空间复杂度:
快速排序在系统内部需要一个栈来实现递归。若每次划分较为均匀,则其递归树的高度为
,故递归后需栈空间(即空间复杂度)为
;最坏情况下,递归树的高度为
,所需的栈空间(即空间复杂度)为
。
快速排序为不稳定排序算法。