【发布时间】:2016-02-03 07:16:27
【问题描述】:
使用具有 O(NlgN) 时间和 O(lgN) 空间的双向迭代器来实现快速排序似乎很简单。那么,std::sort() 需要随机访问迭代器的具体原因是什么?
我已阅读主题why do std::sort and partial_sort require random-access iterators?。但它没有解释可能的std::sort() 实现的具体部分实际上可能需要随机访问迭代器来维持其时间和空间复杂性。
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 问题已更新。我想知道具体情况。不是一般的答案。
-
引用:
To use sequential iterators would come at a O(N) memory cost to store all of those iterators。这足够具体吗? -
但是你的
std::stack<pair> stk;有多大?
标签: c++ algorithm iterator quicksort c++-standard-library