使用具有O(NlgN)時間和O(lgN)空間的雙向迭代器來實現快速排列似乎非常簡單。那麼,std::sort()
需要隨機訪問迭代器的具體原因是什麼?在雙向迭代器上實現快速排序
我已閱讀過有關主題why do std::sort and partial_sort require random-access iterators?。但是它沒有解釋可能需要隨機訪問迭代器來保持其時間和空間複雜度的可能的實現的具體部分。
一種可能實現與O(NlgN)時間和O(LGN)空間:
template <typename BidirIt, typename Pred>
BidirIt partition(BidirIt first, BidirIt last, Pred pred) {
while (true) {
while (true) {
if (first == last) return first;
if (! pred(*first)) break;
++first;
}
while (true) {
if (first == --last) return first;
if (pred(*last)) break;
}
iter_swap(first, last);
++first;
}
}
template <typename BidirIt, typename Less = std::less<void>>
void sort(BidirIt first, BidirIt last, Less&& less = Less{}) {
using value_type = typename std::iterator_traits<BidirIt>::value_type;
using pair = std::pair<BidirIt, BidirIt>;
std::stack<pair> stk;
stk.emplace(first, last);
while (stk.size()) {
std::tie(first, last) = stk.top();
stk.pop();
if (first == last) continue;
auto prev_last = std::prev(last);
auto pivot = *prev_last;
auto mid = ::partition(first, prev_last,
[=](const value_type& val) {
return val < pivot;
});
std::iter_swap(mid, prev_last);
stk.emplace(first, mid);
stk.emplace(++mid, last);
}
}
你真的嘗試過嗎? – Drop
[爲什麼std :: sort和partial \ _sort需要隨機訪問迭代器?](http://stackoverflow.com/questions/24817274/why-do-stdsort-andpartial-sort-require-random -access-iterators) – Drop
@Drop問題已更新。我想知道具體情況。不是一般的答案。 – Lingxi