如何订购具有重复值的数组?

时间:2014-11-11 22:35:59

标签: c++ algorithm

我想订购一些可能有重复的东西。例如:

int values[5] = {4, 5, 2, 5, -1};
int expected[5] = {1, 2, 0, 2, -1};

这里2是最小元素,所以它的顺序是0. 4是第二小,所以它的顺序是1. 5是第三小,我希望它们都有2个顺序。我想跳过某些元素(在上面的例子中为-1)所以这些元素的顺序为-1。

如何在C ++中执行此操作或描述算法?

由于

1 个答案:

答案 0 :(得分:1)

只需对数组进行排序,然后为每个元素分配其排名:

vector<int> v(values, values + 5);
v.push_back(-1);
sort(begin(v), end(v));
v.resize(unique(begin(v), end(v)) - begin(v));
for (int i = 0; i < 5; ++i)
  expected[i] = lower_bound(begin(v), end(v), values[i]) - begin(v) - 1;

这假设所有元素都是非负数或-1。如果负数元素小于-1,则需要特殊情况-1。