快速排序
快速排序(Quicksort) 是一种排序算法,平均时间复杂度为:O(n log n),最坏需要 O(n²),但很少见,快速排序之所以叫快速排序,就是因为它比一般的排序算法要快。
快速排序使用了分而治之的思想,步骤如下:
- 选择基准值(pivot)
- 将数组分成两个子数组:小于基准值的元素和大于基准值的元素
- 对这两个子数组进行快速排序
不同的选取基数值策略对排序性能都有很大的影响。
递归实现:
public static void quickSort(int[] arr) {
qsort(arr, 0, arr.length - 1);
}
private static void qsort(int[] arr, int low, int high) {
System.out.println(String.format("qsort() -> low:%s, high:%s", low, high));
if (low < high) {
//将数组分为两部分
int pivot = partition(arr, low, high);
//递归排序左子数组
qsort(arr, low, pivot - 1);
//递归排序右子数组
qsort(arr, pivot + 1, high);
}
}
private static int partition(int[] arr, int low, int high) {
//枢轴记录
int pivot = arr[low];
while (low < high) {
while (low < high && arr[high] >= pivot) --high;
//交换比枢轴小的记录到左端
arr[low] = arr[high];
while (low < high && arr[low] <= pivot) ++low;
//交换比枢轴小的记录到右端
arr[high] = arr[low