快速排序:

  1. 从待排数列中取出一个数作为基准数 v
  2. 分区过程,将比 v 大的数放在 v 的右边,比 v 小的放在左边
  3. 递归地重复第二步,直到各区间只剩一个数

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class QuickSort {
public static void sort(Comparable[] a) {
sort(a, 0, a.length - 1);
}

private static void sort(Comparable[] a, int lo, int hi) {
if (lo >= hi) {
return;
}
int mid = partition(a, lo, hi);
sort(a, lo, mid - 1);
sort(a, mid + 1, hi);
}

private static int partition(Comparable[] a, int lo, int hi) {
int i = lo;
int j = hi + 1;
Comparable v = a[lo];
while (true) {
while (less(a[++i], v) && i <= hi> ) {
}
while (less(v, a[--j]) && j >= lo) {
}
if (i >= j) {
break;
}
exch(a, i, j);
}
exch(a, lo, j);
return j;
}
}

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 使用 apache RandomUtils 生成测试数据
*/
public static void main(String[] args) {
Comparable[] random = new Comparable[20];
for (int i = 0; i < 20; i++) {
random[i] = RandomUtils.nextInt(1, 10);
}
sort(random);
for (int i = 0; i < 20; i++) {
System.out.print(random[i]);
if (i != random.length - 1) {
System.out.print(" | ");
}
}
isSorted(random);
}