'std::p artition()' 的时间复杂度

Time complexity of `std::partition()`

本文关键字:时间复杂度 std artition      更新时间:2023-10-16

根据cpp偏好:

复杂性
正好std::distance(first,last)谓词的应用,最多std::distance(first,last)交换。如果 Forward它最多满足双向迭代器的要求 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).不?

这似乎是非双向迭代器的实现,仅向前推进。仅通过 n 个项目的序列向前推进,至少需要 n-1 次交换才能将单个非 p 项目从头到尾移动。使用双向迭代器,可以从两端向内工作。