快速排序
公共类快速排序{
publicstaticvoidmain (字符串[ ] args ) {
int [ ] a={ 0,3,6,8,2,4,6,9,7,5 };
new QuickSort ().sort(a ) a,0,a.length-1 );
系统. out.println (arrays.tostring (a ) );
}
公共语音软件(int [ ] a,int low,int high ) {
if (低高度) {
intpivotindex=position(a,low,high );
sort(a,low,pivotIndex - 1 );
sort(a,pivotIndex 1,high );
}
}
公共int位置(inta [ ],int low,int high ) )。
int pivot=a[low];
wile (低高度) {
wile(lowhighpivot=a[high] ) {
high----;
}
a[low]=a[high];
wile(lowhigha[low]=pivot ) {
行;
}
a[high]=a[low];
}
a[low]=pivot;
返回低;
}
}
算法分析:
快速排序的时间主要用于分割操作,分割长度为k的区间需要合计k-1次的关键字比较。
1、最坏的时间复杂度
在最坏情况下,每次划分所选基准时,选择当前无序区间中关键字最小(或最大)的记录,划分结果导致基准左侧子区间为空(或右侧子区间为空),而划分出的另一非空子区间中的记录数目在划分之前因此,快速排序需要进行n-1次划分,第I次划分开始时的区间长度为n-i 1,所需的比较次数为n-I(1In-1 ),因此总的比较次数达到最大值: Cmax=n(n-1
2、最美好的时间复杂性
在某些情况下,每次划分时所取的标准是当前无序区的“中位数”记录,划分结果是标准的左、右两个无序子区间的长度大致相等。 总关键字比较次数:0(nlgn ) ) ) ) ) ) ) ) )。
注:使用递归树分析最佳情况下的比较次数更容易。 由于每个分割左右的子区间的长度大致相等,所以递归树的高度为O(lgn,但与递归树的各层的各节点对应的分割过程中所需的关键字比较次数的合计为n以下,所以在排序过程整体中所需的关键字比较次数c[n]=o[nlgn]
由于快速排序记录的移动次数小于或等于比较次数,因此快速排序的最差时间复杂度应为0(n2 ),最佳时间复杂度应为o ) O(nlgn )。
3、空间复杂性
快速排序需要系统内部有堆栈才能实现递归。 如果每个划分均匀,则递归树的高度为o(lgn ),因此递归后的所需堆栈空间为o(lgn )。 在最坏的情况下,递归树的高度为o(n ),所需的堆栈空间为o(n )。
4、稳定性
快速排序不稳定。