所以 2,6,8 的中位数是 6。现在呢?
下一步是将数组划分为左半部分,包含小于 6 的元素,右半部分包含等于或大于 6 的元素。然后我们对每一半调用快速排序。
以下 Java 程序实现快速排序,显示排序前后的每个子数组。它还显示中位数的选择。
import java.io.*;
public class Quicksort {
void swap(int[] data, int i, int j) {
int t = data[i];
data[i] = data[j];
data[j] = t;
}
void display(int[] data, int left, int right) {
for (int i = 0; i < right; ++i) {
System.out.print(i < left ? " " : " "+data[i]);
}
System.out.println();
}
//--- in-place implementation with median-of-three pivot
int quicksort(int[] data, int left, int right, int callId) {
int saveCallId = callId;
System.out.print(callId+". sorting:");
display(data, left, right);
if (left+1 >= right) {
System.out.print(" "+saveCallId+". result:");
display(data, left, right);
return callId;
}
int ai = left, bi = (left+right)/2, ci = right-1, pos;
int a = data[ai], b = data[bi], c = data[ci];
if (a < b) {
if (c < a) {
pos = ai;
} else if (c < b) {
pos = ci;
} else {
pos = bi;
}
} else {
if (c < b) {
pos = bi;
} else if (c < a) {
pos = ci;
} else {
pos = ai;
}
}
int pivot = data[pos];
System.out.println(" median of ["+a+", "+b+", "+c+"] is "+pivot);
swap(data, right-1, pos);
int tail = left;
for (int i = left; i != right-1; ++i) {
if (data[i] < pivot) {
swap(data, tail, i);
++tail;
}
}
swap(data, right-1, tail);
callId = quicksort(data, left, tail, ++callId);
callId = quicksort(data, tail+1, right, ++callId);
System.out.print(" "+saveCallId+". result:");
display(data, left, right);
return callId;
}
public static void main(String[] args) {
int[] data = new int[]{ 2, 6, 3, 1, 6, 5, 2, 4, 8 };
new Quicksort().quicksort(data, 0, data.length, 0);
}
}
对于输入案例{ 2, 6, 3, 1, 6, 5, 2, 4, 8 },输出为:
0. sorting: 2 6 3 1 6 5 2 4 8
median of [2, 6, 8] is 6
1. sorting: 2 3 1 5 2 4
median of [2, 5, 4] is 4
2. sorting: 2 3 1 2
median of [2, 1, 2] is 2
3. sorting: 1
3. result: 1
4. sorting: 2 3
median of [2, 3, 3] is 3
5. sorting: 2
5. result: 2
6. sorting:
6. result:
4. result: 2 3
2. result: 1 2 2 3
7. sorting: 5
7. result: 5
1. result: 1 2 2 3 4 5
8. sorting: 6 8
median of [6, 8, 8] is 8
9. sorting: 6
9. result: 6
10. sorting:
10. result:
8. result: 6 8
0. result: 1 2 2 3 4 5 6 6 8