和Merge Sort一样,Quick Sort 也是根据 divide-and-conquer 设计的排序算法。和Merge Sort 相比而言,Merge Sort merge是发生在逓归操作(Recursive)之后,而Quick Sort是先分类,再执行逓归操作。
Quick Sort 首先选择一个 pivot point,然后将小於、等於、大於pivot point的值,依类分群(divide),然后再合并(Conquer)。
public static <E> void sort(SinglyLinkedList<E> origin, Comparator<E> comp) {
if (origin == null || origin.size < 2) {
return;
}
// divide
// pick pivot point (pick first element in this implementation)
E pivot = origin.peek().value;
SinglyLinkedList<E> L = new SinglyLinkedList<E>();
SinglyLinkedList<E> E = new SinglyLinkedList<E>();
SinglyLinkedList<E> G = new SinglyLinkedList<E>();
while (!origin.isEmpty()) {
E nodeValue = origin.peek().value;
if (comp.compare(pivot, nodeValue) < 0) {
G.addNodeToLast(origin.removeFirst().value);
} else if (comp.compare(pivot, nodeValue) > 0) {
L.addNodeToLast(origin.removeFirst().value);
} else {
E.addNodeToLast(origin.removeFirst().value);
}
}
// recursive
sort(L, comp);
sort(E, comp);
sort(G, comp);
while (!L.isEmpty()) {
origin.addNodeToLast(L.removeFirst().value);
}
while (!E.isEmpty()) {
origin.addNodeToLast(E.removeFirst().value);
}
while (!G.isEmpty()) {
origin.addNodeToLast(G.removeFirst().value);
}
}
Quick Sort 的Worst Case是如果 Pivot Point选到的是极值(最大或最小值),这时 Divide-and-Conquer 树的高便为 O(n) ,每层合并的成本O(n) ,这时便成了 O(n^2)