java快速排序详解
来源:互联网 发布:批处理 软件静默卸载 编辑:程序博客网 时间:2024/06/07 07:09
快速排序
public class QuickSort {
public static void main(String[] args) {
int[] a = { 0, 3, 6, 8, 2, 4, 6, 9, 7, 5 };
new QuickSort().sort(a, 0, a.length-1);
System.out.println(Arrays.toString(a));
}
public void sort(int[] a, int low, int high) {
if (low < high) {
int pivotIndex = position(a, low, high);
sort(a, low, pivotIndex - 1);
sort(a, pivotIndex + 1, high);
}
}
public int position(int a[], int low, int high) {
int pivot = a[low];
while (low < high) {
while (low < high && pivot <= a[high]) {
high--;
}
a[low] = a[high];
while (low < high && a[low] <= pivot) {
low++;
}
a[high] = a[low];
}
a[low] = pivot;
return low;
}
}
算法分析:
快速排序的时间主要耗费在划分操作上,对长度为k的区间进行划分,共需k-1次关键字的比较。
1、最坏时间复杂度
最坏情况是每次划分选取的基准都是当前无序区中关键字最小(或最大)的记录,划分的结果是基准左边的子区间为空(或右边的子区间为空),而划分所得的另一个非空的子区间中记录数目,仅仅比划分前的无序区中记录个数减少一个。因此,快速排序必须做n-1次划分,第i次划分开始时区间长度为n-i+1,所需的比较次数为n-i(1≤i≤n-1),故总的比较次数达到最大值:Cmax= n(n-1)/2=O(n2)2、最好时间复杂度
在最好情况下,每次划分所取的基准都是当前无序区的"中值"记录,划分的结果是基准的左、右两个无序子区间的长度大致相等。总的关键字比较次数:0(nlgn)注意:用递归树来分析最好情况下的比较次数更简单。因为每次划分后左、右子区间长度大致相等,故递归树的高度为O(lgn),而递归树每一层上各结点所对应的划分过程中所需要的关键字比较次数总和不超过n,故整个排序过程所需要的关键字比较总次数C(n)=O(nlgn)。
因为快速排序的记录移动次数不大于比较的次数,所以快速排序的最坏时间复杂度应为0(n2),最好时间复杂度为O(nlgn)。
因为快速排序的记录移动次数不大于比较的次数,所以快速排序的最坏时间复杂度应为0(n2),最好时间复杂度为O(nlgn)。
3、空间复杂度
快速排序在系统内部需要一个栈来实现递归。若每次划分较为均匀,则其递归树的高度为O(lgn),故递归后需栈空间为O(lgn)。最坏情况下,递归树的高度为O(n),所需的栈空间为O(n)。4、稳定性
快速排序是非稳定的。 2 0
- Java快速排序详解
- java快速排序详解
- 快速排序 -JAVA详解
- java快速排序详解
- 快速排序算法Java详解
- 快速排序详解以及java实现
- 【快速排序详解以及java实现】
- 详解--快速排序---附加java代码
- 详解快速排序(java实现)
- 快速排序详解及JAVA/C++实现
- java常用算法之快速排序详解
- 排序算法——快速排序详解(java实现)
- 排序-快速排序-Java
- 快速排序详解
- 快速排序(详解)
- 快速排序法详解
- 快速排序详解
- 快速排序 详解
- ionic-点击input时键盘自动弹出
- move.js
- 一些值得学习阅读的文章
- Jdk8安装后,再降低版本不生效解决办法
- 存钱问题
- java快速排序详解
- 关于Android中使用SVG特性的探索与总结
- 第16周项目1-验证算法(5)直接选择排序
- sublime使用markdown方法
- 循环语句
- 泛型之三 支持多个方法重载
- 浅谈Flexbox布局
- 事件拦截机制分析
- 关于我的2016