快速排序算法
排序思想
快速排序的主要是利用递归和分区域来排序,其中分区,主要是分成三个区域,小于区,等于区,大于区。
排序过程
比如某一个值 p来划分一个数组,总体过程如下:
- 1,数组当前数大于p,当前数和大于区的前一个数交换,大于区向左扩,当前位置停在原地
- 2,数组当前数小于p,当前数和小于区的后一个数交换,小于区向右扩,当前位置跳到下一个位置
- 3,数组当前数等于p,当前数直接跳到下一个
当前位置的索引 小于 大于区的索引一直执行,直到结束;
完整代码,下面的图片完整的演示了代码的执行过程
完整代码
public static void main(String[] args) {
int[] arr = generationArray(5, 0, 20);
printArr(arr);
quickSort(arr, 0, arr.length - 1);//快速排序
printArr(arr);
}
public static void quickSort(int[] arr, int l, int r) {
if (l < r) {//
swap(arr, l + (int) (Math.random() * (r - l + 1)), r);//l到r选择一个中间随机数
int[] p = partition(arr, l, r);// O(n)
quickSort(arr, l, p[0] - 1);
quickSort(arr, p[1] + 1, r);
}
}
private static int[] partition(int[] arr, int l, int r) {
int less = l - 1;
int more = r;
int i = l;
while (i < more) {
if (arr[i] < arr[r]) {
swap(arr, i++, ++less);
} else if (arr[i] > arr[r]) {
swap(arr, i, --more);
} else {
i++;
}
}
swap(arr, more, r);
return new int[] { less + 1, more };
}
图片演示代码执行逻辑