1、快速排序特点
(1)时间复杂度:O(NlogN);
(2)空间复杂度:O(logN);
(3)稳定性:不稳定;
2、快速排序步骤
(1)在数组范围内,等概率随机选一个数作为划分值,然后把数组分为3部分:
1)左边小于该选中的值;
2)右边大于该选中的值;
3)中间等于该选中的值;
(2)对左侧和右侧范围,递归执行步骤(1);
3、代码
public class QuickSort {
public static void quickSort(int[] arr) {
if (arr == null || arr.length == 0) {
return;
}
quickSort(arr, 0, arr.length - 1);
}
private static void quickSort(int[] arr, int L, int R) {
//等概率随机选择一个位置,与最右侧数字进行交换
swap(arr, (int) (Math.random() * (R - L + 1) + L), R);
//将数组arr划分成3部分,返回中间部分等于区域的最左、最右坐标位置
//p[0]:等于区域左边界;p[1]:等于区域右边界
int[] p = partition(arr, L, R);
//L,p[0]-1:小于区域递归;
quickSort(arr,L,p[0]-1);
//p[1]+1,R:大于区域递归;
quickSort(arr, p[1] + 1, R);
}
private static int[] partition(int[] arr, int l, int r) {
//p1:指向小于区域边界,当前没有,所有指向l-1
int p1=l-1;
//p2:指向大于区域边界,当前没有,所有指向r,此时arr[r]的值为随机选中的值
int p2=r;
//p:移动比较的指针
int p=l;
while (p < p2) {
//如果当前数小于选中的数
if (arr[p] < arr[r]) {
//小于选中值的边界扩充,p1++
p1++;
//交换值
swap(arr, p, p1);
p++;
}
if (arr[p]>arr[r]){
//大于选中值的边界边界扩充,p2--
p2--;
//交换值
swap(arr,p,p2);
}else {
//相等情况,p++
p++;
}
}
//交换p2,r位置上的数
swap(arr, p2, r);
//此时,p2指向了等于选中的数的位置
//返回相等区域的边界
return new int[]{p1 + 1, p2};
}
private static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}