【问题标题】:Partial sorting: nth elements having preseved order部分排序:具有保留顺序的元素
【发布时间】:2015-05-22 16:33:56
【问题描述】:

任务是对具有重复 s.t. 的向量进行部分排序。如果对向量进行了排序,则中位数(第 n 个元素)位于它的位置。所有较小的元素都应该在左边,所有较大的元素都应该在右边。与中值相同的所有元素都必须按原始顺序排列 - 但只有这些元素不是其余元素。

你会怎么解决这个问题?

我的初步解决方案:

  1. 使用 std::nth_element() 查找中间元素
  2. 遍历向量并仅对具有与中位数相同值的元素进行排序。我将如何有效地做到这一点?

【问题讨论】:

  • 您当前的解决方案有什么问题?
  • 我正在寻找一个非常有效的解决方案——尤其是第 2 部分:仅对向量的特定值进行排序。
  • 当元素具有相同值时,如何定义“原始顺序”?不是例如的任何排列{3 3 3 3}“原订单”?
  • 这是一个k维向量vector<Point<T>>和struct Point{ num_t x,y,z, ID; };所以有一个原始顺序。

标签: c++ nth-element partial-sort


【解决方案1】:

使用 partition 或 stable_partition(保留原始顺序)。

class Predicate{
    int median_value;
    public:
    Predicate(int med) : median_value(med) {}
    bool operator()(int x){
    return x < median_value;
    }
};

int main(){

vector<int> v{ 10, 20, 30, 10, 30};

int median = 20;

cout << "median  = " << median << endl;

stable_partition(v.begin(), v.end(), Predicate(median));

for ( auto i : v)
    cout << i << " ";
}

【讨论】:

  • 这可能有效 - 我相信 stable_partition 是平均 O(n) 和最差的 O(nlogn)。不过我会很感兴趣:你如何找到中位数?使用此选项,您在查找中位数时不允许更改顺序..对吗?
  • 在上面的代码中没有解决中值计算。可能有(?)一个集成算法来找到中位数,同时保持顺序。
猜你喜欢
  • 2013-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多