我想订购一些可能有重复的东西。例如:
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 ++中执行此操作或描述算法?
由于
答案 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。