【发布时间】:2016-02-03 03:30:45
【问题描述】:
根据cppreference:
复杂性
恰好std::distance(first,last)谓词的应用程序和最多std::distance(first,last)交换。如果 ForwardIt 最多满足 BidirectionalIterator 的要求std::distance(first,last)/2交换完成。
我查看了底部的示例实现:
template<class ForwardIt, class UnaryPredicate>
ForwardIt partition(ForwardIt first, ForwardIt last, UnaryPredicate p)
{
if (first == last) return first;
ForwardIt part(first++);
if (first == last) return p(*part) ? first : part;
while (first != last) {
if (p(*part))
++part;
else if (p(*first)) {
iter_swap(part, first);
++part;
}
++first;
}
return part;
}
我认为它最多执行 std::distance(first,last)/2 交换而不是 std::distance(first,last)。没有?
【问题讨论】:
-
对于 Alf 的答案示例,
[0,1,1,1,1,1,…]和谓词_ != 0。 -
请注意,这个实现是错误的,因为它调用谓词的次数太多了。
-
@T.C. ehhh,不是这样的。它恰好调用了 N 次
-
@AlexeyAndronov 不,循环的每次迭代都可以调用谓词两次。
-
@T.C.哦,你是对的
标签: c++ algorithm c++11 time-complexity quicksort