快速排序
快速排序的特点包括它是原地排序(只需要一个很小的辅助栈),且将长度为 N 的数组排序所需要的时间和 NlgN 成正比。时间复杂度度为 O(NlogN),空间复杂度为 O(logN)。
基本算法
快速排序是一种分治的排序算法,它将一个数组分成两个子数组,将两部分独立地排序。快速排序和归并排序是互补的:
- 归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序;
- 快速排序通过一个切分元素将数组分为两个子数组,左子数组小于等于切分元素,右子数组大于等于切分元素,再将这两个子数组排序也就将整个数组排序了。
在归并排序中,一个数组被等分为两半;而在快速排序中,切分元素的位置取决于数组的内容。快速排序的大致过程如下图所示。
快速排序的实现代码:
public class QuickSort<T extends Comparable<T>> extends AbstractSort<T> {
@Override
public void sort(T[] arr) {
shuffle(arr); // 打乱数组
sort(arr, 0, arr.length - 1);
}
private void sort(T