1. 主要思路
2. 过程演示
3. 代码演示
public class QuickSort {
/**
快速排序
在 Java中, 快速排序被用作基本数据类型的排序 (当然, 不只快速排序一种)
快速排序是实践中的一种快速的排序算法, 在 C++或对 Java基本类型的排序证特别有用.
它的平均运行时间是 O(N logN), 该算法之所以特别快, 主要是由于非常精炼和高度优化的内部循环.
它的最坏情形性能为 O(N^2), 但经过稍许努力可是这种情形极难出现.
通过将快速排序和堆排序结合, 由于堆排序的 O(N logN)最坏情形运行时间, 我们可以对几乎所有的输入都能达到快速排序的快速运行时间
*/
public static <AnyType extends Comparable<? super AnyType>> void quickSort(AnyType[] a) {
quickSort(a, 0, a.length - 1);
}
/**
* 快速排序主例程
*
* @param a 原始数组
* @param left 起始索引
* @param right 结束索引
* @param <AnyType> 实现了 Comparable接口的类或其子类
*/
private static <AnyType extends Comparable<? super AnyType>> void quickSort(AnyType[] a, int left, int right) {
int CUTOFF = 10;
if (left + CUTOFF <= right) {
AnyType pivot = median3(a, left, right);
int i = left, j = right - 1;
for ( ; ; ) {
while (a[++i].compareTo(pivot) < 0) {
}
while (a[--j].compareTo(pivot) > 0) {
}
if (i < j)
swap(a, i, j);
else
break;
}
swap(a, i, right - 1);
quickSort(a, left, i - 1);
quickSort(a, i + 1, right);
} else {
insertionSort(a, left, right);
}
}
/**
* 对数组的指定部分使用插入排序
* @param a 原始数组
* @param left 起始索引
* @param right 结束索引
* @param <AnyType> 实现了 Comparable接口的类型或其子类
*/
private static <AnyType extends Comparable<? super AnyType>> void insertionSort(AnyType[] a, int left, int right) {
if (right - left == 0 || left < 0 || right > a.length - 1) {
return;
}
AnyType tmp;
int j;
for (int i = left + 1; i <= right; i++) {
tmp = a[i];
for (j = i; j > left && tmp.compareTo(a[j - 1]) < 0; j--) {
a[j] = a[j - 1];
}
a[j] = tmp;
}
}
/**
三数中值分割法
使用左端, 右端和中心位置上的三个元素的中值作为枢纽元
*/
private static <AnyType extends Comparable<? super AnyType>> AnyType median3(AnyType[] a, int left, int right) {
int center = (right - left) / 2;
if (a[center].compareTo(a[left]) < 0) {
swap(a, left, center);
}
if (a[right].compareTo(a[left]) < 0) {
swap(a, left, right);
}
if (a[right].compareTo(a[center]) < 0) {
swap(a, center, right);
}
swap(a, center, right - 1);
return a[right - 1];
}
/**
* 交换数组中两个元素的位置
*/
private static <AnyType extends Comparable<? super AnyType>> void swap(AnyType[] arr, int i, int j) {
if (arr == null || arr.length <= 1 || i == j) {
return;
}
AnyType tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}
}
4. 复杂度分析