0001 auto Get = [](auto& K, Rank& s, Rank& t) { t = K.pop(); s = K.pop(); }; //子任务出栈 0002 auto Put = [](auto& K, Rank s, Rank t) { if (1 < t-s) { K.push(s); K.push(t); } }; //入栈 0003 template <typename T> void Vector<T>::quickSort(Rank lo, Rank hi) { //迭代版快速排序:lo < hi 0004 Stack<Rank> Task; Put(Task, lo, hi); //任务栈,初始仅含一个任务(整体排序) 0005 while (!Task.empty()) { //先序遍历调用树 0006 Get(Task, lo, hi); Rank mi = partition(lo, hi); //针对当前子任务,在[lo,hi)内构造轴点 0007 if (mi-lo < hi-mi) { Put(Task, mi+1, hi); Put(Task, lo, mi); } 0008 else { Put(Task, lo, mi); Put(Task, mi+1, hi); } 0009 } //大任务优先入栈,小任务优先出栈执行,可保证递归深度(空间成本)不过O(logn) 0010 } //quickSort