快速排序是一种分区交换排序,是目前已知实测最快的一种排序算法.
6.快速排序
算法思想
快速排序的基本思想是,通过一趟划分将数组或线性表划为左部,右部,和基准值.其中左部都比基准值小,右部都比基准值大.
(1)在数组中选择一个枢纽元key,一般情况下选取第一个数据
(2)将所有比key值小的数据移到key值左边,将大于key值的数据移到key值右边.
(3)将左部和右部分别递归重复第二步,直到所有元素排好序位置
示意图
代码演示
/**
* @param array
* 快速排序
*/
public static void quickSort(int[] array) {
if(array.length>0){
_quickSort(array, 0, array.length-1);
}else{
System.out.println("请输入非空数组!");
}
}
快排主体
/**
* @param array
* @param left
* @param right
* 快速排序主体
*/
public static void _quickSort(int[] array,int left ,int right) {
if(left<right){
//划分
int middle=patition(array,left,right);
_quickSort(array, left, middle-1); //对左边快排
_quickSort(array, middle+1, right);//对右边快排
}
}
划分过程
/**
* @param array
* @param left
* @param right
* @return middle 中枢元下标
* 快排划分
*/
private static int patition(int[] array, int left, int right) {
int middle;
int key=array[left];
while(left<right){
while(array[right]>=key&&left<right){
right--;
}
array[left]=array[right];
while(array[left]<key&&left<right){
left++;
}
array[right]=array[left];
}
array[left]=key;
middle=left;
return middle;
}
算法性能分析
算法的最好时间复杂度为
O(nlong2n)
最坏时间复杂度为
O(n2)
平均时间复杂度为
O(nlong2n)