Мы имеем несортированную последовательность из N чисел (1, 2, 3, 4,... N). Мы можем сортировать всю последовательность путем замены соседних элементов в определенном порядке. Учитывая последовательность, как я могу вычислить минимальные возможные свопы, необходимые для сортировки последовательности.
В качестве примера рассмотрим последовательность {4, 2, 5, 3, 1}.
Лучший способ сортировки - использовать 7 свопов в следующем порядке
- Обмен 3, 1: {4, 2, 5, 1, 3}
- Swap 5, 1: {4, 2, 1, 5, 3}
- Обмен 4, 2: {2, 4, 1, 5, 3}
- Swap 4, 1: {2, 1, 4, 5, 3}
- Обмен 2, 1: {1, 2, 4, 5, 3}
- Обмен 5, 3: {1, 2, 4, 3, 5}
- Обмен 3, 4: {1, 2, 3, 4, 5}
Жадный алгоритм не оказался плодотворным. Контрпример был прост в построении. Следующим очевидным выбором для решения было динамическое программирование.
Скажем, что мы имеем несортированную последовательность: {A1, A2,... Ai, A (i + 1),..., An}. Мы знаем минимальное количество свопов, необходимых для сортировки последовательности {Ai, A (i + 1),..., An} - Min [Ai, A (i + 1),..., An}. Проблема заключается в поиске Min [A (i-1), Ai,..., An].
Ну, первая мысль, которая появилась в моей голове, заключалась в том, чтобы просто добавить количество шагов, необходимых для размещения A (i-1) в правильном месте в уже отсортированной последовательности {Ai,..., An}. Это работает: пример, заданный в вопросе, был решен с использованием того же метода.
Но я не смог доказать обоснованность этого решения. Это часто бывает со мной. Когда я думаю, что я решил проблему, лучшее, что я могу сделать, это получить "интуитивное" доказательство. Я в старшей школе и не имею формального обучения в алгоритмах как таковых. Я делаю это чисто из интереса.
Есть ли строгие математические обозначения, что эта проблема может быть преобразована и доказана формально? Могут ли эти обозначения распространяться на другие проблемы? Как? Я был бы признателен, если бы его можно было представить в форме, приемлемой для школьника.