如何以稳定的方式进行部分排序

时间:2014-12-02 11:04:09

标签: c++ sorting

std::partial_sort是否稳定,如果没有,是否有标准库提供的稳定的部分排序,例如提升?

1 个答案:

答案 0 :(得分:5)

partial_sort是高效且易于提供的,因为它基本上是一个快速排序,其中跳过了对于所需范围不必要的递归。没有等效的有效部分稳定排序算法; stable_sort通常实现为合并排序,并且合并排序的递归工作方式错误。

如果要使局部排序稳定,则需要将位置信息与每个元素相关联。如果你有一个可修改的zip范围你可以通过将元素和iota向量压缩在一起来实现,但是在当前的迭代器概念中实际上不可能构建可修改的zip范围,因此通过迭代器进行间接排序并依赖迭代器更容易'订购。换句话说,你可以这样做:

using MyThingV = std::vector<MyThing>;
using MyThingIt = typename MyThingV::iterator;
MyThingV things;
// Set up a vector of iterators. We'll sort that.
std::vector<MyThingIt> sorted; sorted.reserve(things.size());
for (auto it = things.begin(); it != things.end(); ++it) sorted.push_back(it);

std::partial_sort(sorted.begin(), sorted.begin() + upto_index, sorted.end(),
  [](MyThingIt lhs, MyThingIt rhs) {
    // First see if the underlying elements differ.
    if (*lhs < *rhs) return true;
    if (*rhs < *lhs) return false;
    // Underlying elements are the same, so compare iterators; these represent
    // position in original vector.
    return lhs < rhs;
  });

现在您的基本向量仍未排序,但迭代器向量按您希望的方式排序。