快速排序对包含n个数的输入数组,最坏情况运行时间为Θ(n2), 但快速排序通常是用于排序的最佳的实用选择,
这是因为其平均性能相当好:期望的运行时间为Θ(nlgn), 且Θ(nlgn)记号中隐含的常数因子很小,另外它还能
进行就地排序。
伪码:
QUICKSORT(A, p, r) if p < r then q ← PARTITION(A, p, r) QUICKSORT(A, p, q - 1) QUICKSORT(A, q + 1, r)
数组划分:
PARTITION(A, p, r) x ← A[r] i ← p - 1 for j ← p to r - 1 do if A[j] <= x then i ← i + 1 exchange A[i] ↔ A[j] exchange A[i + 1] ↔ A[r] return i + 1
Java实现:
public void quickSort(int[] a, int p, int r) { if (p < r) { int q = partition(a, p, r); quickSort(a, p, q - 1); quickSort(a, q + 1, r); } } private int partition(int[] a, int p, int r) { int x = a[r]; int i = p - 1; for (int j = p; j < r; j++) { if (a[j] <= x) { i = i + 1; swap(a, i, j); } } swap(a, i + 1, r); return i + 1; } private void swap(int[] data, int src, int des) { int tmp = data[des]; data[des] = data[src]; data[src] = tmp; }