1 .经典快速排序图标流程
(1)经典快速排序的总体流程
)2)按标准值划分的流程
2 .随机快速排序
在典型的快速排序中,始终将数组或某个部分的最后一个元素指定为参考值,而在随机快速排序中,将指定数组或某个部分的随机值指定为参考值。
3 .动图展示
quickSort.gif
随机快速排序Java代码实现
//*
*用于有序排序整数数组arr的快速排序
*/
公共服务语音quicksort (int [ ] arr )。
if(arr==null||arr.length2) {
返回;
}
快速排序(arr,0,arr.length - 1 );
}
//*
*快速排序,使整数数组arr的[L,R]部分有序
*/
publicstaticvoidquicksort (int [ ] arr,int L,int R ) {
if(LR ) {
//用最后一个元素交换数组中的随机元素。 如此,将最后的要素设为基准值,实际上将数组中的随机要素设为基准值
swap(arr,new Random ).nextint(r-L1 ) l,r );
int[]p=partition(ARR,l,r );
快速排序(arr,l,p[0] - 1 );
快速排序(arr,p[1] 1,r );
}
}
//*
*分区过程,在整数数组arr的[L,R]部分,您可以:
大于arr[R]的元素位于[L,R]部分的右侧,但这部分数据不一定有序
小于arr[R]的元素位于[L,R]部分的左侧,但该部分的数据不一定有序
与arr[R]相等元素位于[L,R]部分的中间
*返回由部分第一个元素的下标和最后一个下标组成的整数数组
*/
公共静态int [ ] partition (int [ ] arr、int L、int R ) {
int basic=arr[R];
int less=L - 1;
int more=R 1;
wile(Lmore ) {
if(ARR[L]basic ) {
swap(arr,less,l );
}elseif(ARR[L]basic ) ) )
swap(arr、--more、l );
} else {
L;
}
}
返回新int [ ] { less 1,more - 1 };
}
/*
*在交换数组arr中,下标为I、下标为j的位置的要素
*/
publicstaticvoidswap(int[]arr,int i,int j ) {
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
5 .复杂性
时间复杂性: o(nlogn ) )
空间复杂度:快速排序使用递归,递归使用堆栈,因此空间复杂度为o(logn )
稳定性:快速排序是一种不稳定的排序算法,因为它不保证同一元素的相对位置不变