template <typename Object, typename Sequence>
class QuickSort { // QuickSort class
protected: // recursive utility
void quickSortStep(Sequence& S, int leftBound, int rightBound);
public:
void quickSort(Sequence& S); // main entry point
};
template <typename Object, typename Sequence>
void QuickSort<Object, Sequence>:: // recursive portion
quickSortStep(Sequence& S, int leftBound, int rightBound) {
if (leftBound >= rightBound) return; // 0 or 1 elements
Object pivot = S.atRank(rightBound).element(); // select last as pivot
int leftIndex = leftBound; // will scan rightward
int rightIndex = rightBound - 1; // will scan leftward
while (leftIndex <= rightIndex) {
while ((leftIndex <= rightIndex) && // scan right to larger
S.atRank(leftIndex).element() <= pivot)
leftIndex++;
while ((rightIndex >= leftIndex) && // scan left to smaller
S.atRank(rightIndex).element() >= pivot)
rightIndex--;
if (leftIndex < rightIndex) // both elements found
S.swapElements(S.atRank(leftIndex), S.atRank(rightIndex));
} // until indices cross
// pivot at leftIndex
S.swapElements(S.atRank(leftIndex), S.atRank(rightBound));
quickSortStep(S, leftBound, leftIndex-1); // recur on both sides
quickSortStep(S, leftIndex+1, rightBound);
}
template <typename Object, typename Sequence>
void QuickSort<Object, Sequence>::
quickSort(Sequence& S) { // main entry point
if (S.size() <= 1) return; // 0 or 1 elements
quickSortStep(S, 0, S.size()-1); // call sort utility
}