Я хочу заказать массив материалов, которые могут иметь дубликаты. Например:
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.