@cegthgtlhj

Как проранжировать числовой массив?

Как проранжировать числовой массив ?
.
есть массив флоат чисел типа 1234,56
не более 100 чисел в массиве, расположенных беспорядочно
задача не отсортировать числа, а заменить эти числа в массиве их рангами, не меняя их местами.
То есть самое маленькое число получает ранг 0, самое большое число получает ранг равный размеру архива минус единица. Упорядочивать массив не нужно.
.
Есть ли какое-то элегантное решение кроме следующего примитивного?
- создать дополнительный массив такого же размера и заполнить его номерами по порядку.
- отсортировать первый массив по возрастанию / убыванию и параллельно ему меняя дополнительный массив
- в отсортированном массиве заменить все числа на ранги
- отсортировать дополнительный массив по возрастанию (приведя его в первоначальный вид) и при этом параллельно менять основной массив.

Текст на С++ приветствуется с благодарностями.
Я на С++ всего вторую неделю - не силён.
  • Вопрос задан
  • 243 просмотра
Решения вопроса 1
tsarevfs
@tsarevfs Куратор тега C++
C++ developer
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];   
    });
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Пусть есть массив values[N].
Создаём второй массив order[N], записываем в него порядковые номера, order[i] = i.
Сортируем order[], сравнивая values[order[i]]].
Проходим order[] записывая values[order[i]] = i.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы