排序算法总结之快速排序 Quick Sort
来源:互联网 发布:xp怎么查找网络打印机 编辑:程序博客网 时间:2024/05/16 12:12
算法原理:
快速排序采用分治的思想 (divide and conquer):
1. 首先将原数组根据pivot的值划分成两个字数组,一个数组的的值都小于pivot, 一个数组的值都大于pivot;
2. 对两个子数组分别进行排序
3. 把已经有序的子数组合并得到有序的数组。
算法伪代码:
伪代码出自算法导论快速排序算法部分
QUICKSORT (A, p, r)
if (p < r)
then q = patition (A, p, r)
QUICKSORT (A, p, q-1)
QUICKSORT (A, q+1, r)
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
算法性能分析:
时间复杂度:算法的时间复杂度取决于pivot的选择,因为pivot的选择决定了最终划分的两个字数组是否平均。
1. 最坏情况 O(n^2)
最坏情况产生于每次选择的pivot都是最大的,即数组已经是排好序的,从而导致划分的子数组元素个数分别为n-1和n,算法时间复杂度可以用公式表示为:
T(n) = T(n-1) + T(0) + cn
2. 最好情况 O(nlogn)
最好的情况产生于每次选择的pivot都可以把数组平均分成两个子数组, 算法时间复杂度的公式表示为:
T(n) = 2T(n/2) + cn
3. 平均情况 O(nlogn)
使用算法导论中的方法,假设每次子数组的划分比例为9:1,算法的时间复杂度公式为:
T(n) = T(9n/10) + T(n/10) + cn
空间复杂度:快速排序算法的空间复杂度的产生源于递归调用时栈空间的使用。
1. 最坏情况 O(n)
最坏情况下需要进行n-1次递归调用
2. 最好情况和平均情况 O(logn)
最好情况和平均情况下需要 O(logn)次递归调用
稳定性:不稳定
快速排序的Java版本实现:
private void quick(int[] A, int p, int r){<span style="white-space:pre"></span>if(p < r){int q = partition(A, p, r);quick(A, p, q-1);quick(A, q+1, r);}}private int partition(int[] A, int p, int r){int x = A[r];int i = p - 1;for(int j=p;j<r;j++){if(A[j] < x){i++;int temp = A[i];A[i] = A[j];A[j] = temp;}}int temp = A[i+1];A[i+1] = A[r];A[r] = temp;return i+1;}
0 0
- 排序算法总结之快速排序 Quick Sort
- 排序算法之快速排序(Quick sort)
- 算法---快速排序(quick sort)
- 快速排序算法-Quick Sort
- 经典排序算法 - 快速排序Quick sort
- 经典排序算法 - 快速排序Quick sort
- 经典排序算法 - 快速排序Quick sort
- 经典排序算法 - 快速排序Quick sort
- 经典排序算法 - 快速排序Quick sort
- 【算法基础】【排序】快速排序 - Quick Sort
- 经典排序算法 - 快速排序Quick sort
- 常见排序算法 - 快速排序 (Quick Sort)
- 经典排序算法 - 快速排序Quick sort
- 排序算法---快速排序(Quick Sort)
- 交换排序算法:快速排序-Quick Sort
- 排序之快速排序(Quick Sort)
- 白话经典算法系列之六 快速排序(Quick sort)
- 算法分析之——quick-sort快速排序
- Android compile & build
- 类与对象
- 树莓派通过物联网照顾宠物龟
- 一个实习生的最高境界
- 【JAVA学习】10.内部类
- 排序算法总结之快速排序 Quick Sort
- 《netty权威指南》2.5 4中IO的对比
- python代码加密
- 在使用Git push或pull代码的时候,总是要输入用户名和密码的问题
- android.app.SuperNotCalledException: Activity {} did not call through to super.onDestory() 解决办法
- 八大排序
- Ubuntu15.04单机/伪分布式安装配置Hadoop与Hive试验机
- OpenTLD 未完成 - 虎头
- (java)利用BASE64编码和解码图片文件