Как проранжировать числовой массив ?
.
есть массив флоат чисел типа 1234,56
не более 100 чисел в массиве, расположенных беспорядочно
задача не отсортировать числа, а заменить эти числа в массиве их рангами, не меняя их местами.
То есть самое маленькое число получает ранг 0, самое большое число получает ранг равный размеру архива минус единица. Упорядочивать массив не нужно.
.
Есть ли какое-то элегантное решение кроме следующего примитивного?
- создать дополнительный массив такого же размера и заполнить его номерами по порядку.
- отсортировать первый массив по возрастанию / убыванию и параллельно ему меняя дополнительный массив
- в отсортированном массиве заменить все числа на ранги
- отсортировать дополнительный массив по возрастанию (приведя его в первоначальный вид) и при этом параллельно менять основной массив.
Текст на С++ приветствуется с благодарностями.
Я на С++ всего вторую неделю - не силён.
std::vector indices(data.size());
for (size_t i = 0; i < data.size(); ++i)
{
indices[i] = i;
}
std::sort(indices.begin(), indices.end(), [&data](int a, int b) {
return data[a] < data[b];
});
классно вы написали небрежно так. Коротенько, компактно и с виду простенько. Мне надо несколько часов или дней чтобы в этом разобраться. Разберусь дай бог и отмечу решением.
Благодарю вас.
cegthgtlhj, чего там разбираться-то? :) Функция sort, в которой указывается, что операцию проводить от начального элемента массива (begin) до последнего: end с условием при сравнении пар элементов, что левое будет меньше правого (data[a] < data[b]) :)
SEOVirus,
у меня ушла куча времени чтобы разобраться в том, что означают все эти для вас элементарные иероглифы )))
всё понял. Единственное в чем не уверен до конца, что последнее выражение действительно работает верно. Для меня это пока многовато. В любом случае благодарю вас за ваш текст, хотя бы убедился что я все правильно понял.
cegthgtlhj, Возможно стоит почитать что-нибудь про основы языка. Без понимания основных концептов будет сложновато.
Что такое ссылка, указатель, итератор, массивы, классы, шаблоны (например std::vector это шаблонный класс, "обертка" над массивом) как они передаются в функции.
Для правильного вопроса надо знать половину ответа
Пусть есть массив values[N].
Создаём второй массив order[N], записываем в него порядковые номера, order[i] = i.
Сортируем order[], сравнивая values[order[i]]].
Проходим order[] записывая values[order[i]] = i.