Прочитайте только первые два абзаца, если вам нужна подсказка. Для этого есть эффективное решение (если, конечно, я не ошибся). Сначала отсортируйте список. Теперь мы можем написать исходный список как список произведений непересекающихся циклов.
Например, 5,3,4,2,1 имеет два цикла (5,1) и (3,4,2). Цикл можно представить как начинающийся с 3, 4 находится на 3 месте, 2 на 4 месте, а 4 на 3. место. Конечная цель - 1,2,3,4,5 или (1) (2) (3) (4) (5), пять непересекающихся циклов.
Если мы переключим два элемента из разных циклов, скажем, 1 и 3, то получим: 5,1,4,2,3 и в циклической записи (1,5,3,4,2). Два цикла объединены в один цикл, это противоположно тому, что мы хотим сделать.
Если мы переключим два элемента из одного и того же цикла, скажем, 3 и 4, то получим: 5,4,3,2,1 в обозначении цикла (5,1) (2,4) (3). Один цикл делится на два меньших цикла. Это приближает нас к цели всех циклов длины 1. Обратите внимание, что любое переключение двух элементов в одном цикле разделяет цикл на два цикла.
Если мы можем определить оптимальный алгоритм для переключения одного цикла, мы можем применить его для всех циклов и получить оптимальный алгоритм для всей сортировки. Один алгоритм состоит в том, чтобы взять минимальный элемент в цикле и переключить его с тем, в чьей позиции он находится. Так что для (3,4,2) мы бы переключили 2 на 4. Это оставляет нам цикл длины 1 элемент просто переключился в правильное положение) и цикл размером на один меньше, чем раньше. Затем мы можем применить правило снова. Этот алгоритм переключает наименьшую длину цикла элемента -1 раз и каждый второй элемент один раз.
Чтобы преобразовать цикл длины n в циклы длины 1, нужно выполнить n - 1 операций. Каждый элемент должен использоваться как минимум один раз (подумайте о каждом элементе, который нужно отсортировать, его нужно переместить в правильное положение). Алгоритм, который я предложил, воздействует на каждый элемент один раз, что должны делать все алгоритмы, затем каждая другая операция выполнялась на минимальном элементе. Ни один алгоритм не может быть лучше.
Этот алгоритм использует O (n log n) для сортировки, а затем O (n), чтобы связываться с циклами. Для решения одного цикла требуется O (длина цикла), общая длина всех циклов равна n, поэтому стоимость операций цикла равна O (n). Конечное время выполнения O (n log n).