Ваш алгоритм работает для списка неотрицательных целых чисел, но, как отмечали другие, он неэффективен из-за повторного вычисления максимального значения.
Я не уверен, что добавляю много здесь, поскольку ответ Дана Ди является правильным, но, возможно, немного больше объяснений поможет немного ...
То, что вы ищете в своем примере {2,3,10,5,1}
сопоставления с {1,2,4,3,0}
, представляет собой список индексов, которые ваш исходный список будет занимать в отсортированном списке.
Наиболее естественный способ добиться этого - сортировка, индексация и «сортировка» следующим образом (и как это реализовано в более кратком решении Дана Д.):
Добавить индексный столбец к исходным данным:
{2,3,10,5,1} => {(2,0), (3,1), (10,2), (5,3), (1,4)}
Сортировать по оригинальному столбцу:
{(2,0), (3,1), (10,2), (5,3), (1,4)} => {(1,4), (2,0), (3,1), (5,3), (10,2)}
Добавить еще один индексный столбец:
{(1,4), (2,0), (3,1), (5,3), (10,2)} => {(1,4,0), (2,0,1), (3,1,2), (5,3,3), (10,2,4)}
Вернитесь к исходному порядку, отсортировав по первому столбцу индекса:
{(1,4,0), (2,0,1), (3,1,2), (5,3,3), (10,2,4)} => {(2,0,1), (3,1,2), (10,2,4), (5,3,3), (1,4,0)}
Удалите исходный столбец и первый столбец индекса, оставив только индекс, добавленный в середине, который теперь помещен в правильную позицию:
{(2,0,1), (3,1,2), (10,2,4), (5,3,3), (1,4,0)} => {1,2,4,3,0}
Эта стратегия будет работать независимо от типа данных исходного списка, если она может быть отсортирована.
Поскольку проблема определенно связана с некоторой сортировкой, я сильно сомневаюсь, что вы можете добиться большего успеха, чем эта, для повышения эффективности. Добавление и удаление столбцов является линейным, а сортировка дважды не намного хуже, чем сортировка один раз.