如何对具有重复值的数组进行排序

How can I order an array with duplicate values?

本文关键字:数组 排序      更新时间:2023-10-16

我想订购一个可能有重复项的填充数组。例如:

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++中做到这一点,或者描述一个算法?

感谢

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

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进行特殊处理。