Как я могу заказать массив с повторяющимися значениями?

0

Я хочу заказать массив материалов, которые могут иметь дубликаты. Например:

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++ или описать алгоритм?

благодаря

  • 2
    Другими словами, вы хотите вычислить их ранг в отсортированном наборе? Как бы вы справились с другим элементом 10 - это будет порядок 3, игнорируя наличие двух порядков 2 или порядка 4? Я подозреваю, что вам придется отсортировать подмножество значений, которые вы не хотите игнорировать, затем сосчитать в этом отсортированном наборе, чтобы определить ранги на карте или чем-то подобном, затем пройтись по исходному набору и посмотреть каждый элемент в ранговая карта. Но могут быть и лучшие способы.
  • 0
    Да, я хочу вычислить ранг. Таким образом, {10, 4, 5, 2, 5, -1} будут иметь ранг {3, 1, 2, 0, 2, -1}. Но я не хочу менять порядок элементов в массиве «values».
Показать ещё 5 комментариев
Теги:
algorithm

1 ответ

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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню