快速排序
来源:互联网 发布:社会网络分析大数据 编辑:程序博客网 时间:2024/06/07 00:45
算法思想:快排和归并排序一样采用了分治思想,包括三部分治过程:
分解——将数组A[p...r]划分成两个子数组,其中A[p...q-1]<=A[q]<=A[q+1...r],A[q]称为划分主元,可以是数组中的任意元素,最简单的取法为数组最后一个元素,即A[r]
解决——通过递归调用快速排序,对子数组A[p...q-1]和A[q+1...r]进行排序
合并——因为子数组都是原址排序,因此不需要合并,A[p...r]已经有序
算法伪代码如下:
java实现:
public class TestQuickSort {public static void main(String[] args) {int[] A = new int[10];System.out.print("快排之前:");for(int i = 0;i < A.length;i++) {A[i] = (int)(Math.random() * 10);System.out.print(A[i] + " ");}System.out.println("");quickSort(A,0,A.length-1);System.out.print("快排之后:");for(int i = 0;i < A.length;i++) {System.out.print(A[i] + " ");}}//快排public static void quickSort(int[] A,int p,int r) {if(p < r) {int q = partition(A, p, r);quickSort(A,p,q-1);quickSort(A, q+1, r);}}//划分操作public static int partition(int[] A,int p,int r) {//i指针指向当前左侧已经划分好的最后一个元素int i = p-1;int x = A[r];//j指针指向当前待划分的元素for(int j = p;j < r;j++) {if(A[j] < x) {int temp = A[j];A[j] = A[i+1];A[i+1] = temp;i++;}}//将划分主元归位A[r] = A[i+1];A[i+1] = x;return i+1;}}
运行结果:
复杂度分析:
快速排序的时间复杂度和划分主元的选取密切相关,当划分完全不平衡时,即出现最坏情况,划分的子问题规模为n-1和0,则时间复杂度为O(n2)
当划分比例是常数时,时间复杂度为O(nlogn)
稳定性:
快速排序算法是不稳定的
阅读全文
0 0
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- Java 会比 Go 长寿?编程语言的生命周期要如何判断
- HDFS数据不均衡解决方案:基于剩余空间大小的均衡策略
- 从奇虎360离职去创业型公司当CTO是一种怎样的体验?
- 设计模式之组合模式
- Java线程总结
- 快速排序
- Codeforces Problem 332B
- 使用cookie实现跨域系统单点登录
- CI持续集成系统环境--Gitlab+Gerrit+Jenkins完整对接
- 值传递String
- CTF小练
- java_归并排序
- 笑出腹肌的程序猿搞笑趣图
- 开源许可证教程