Получение следующего объекта
Содержание
Определение
В комбинаторике перестано́вка — это упорядоченный набор чисел обычно трактуемый как биекция на множестве , которая числу i ставит соответствие i-й элемент из набора. Число n при этом называется порядком перестановки.
Перебор перестановок в лексикографическом порядке
Каждая следующая перестановка строится следующим образом:
Двигаясь с конца массива сравниваем соседние элементы, если a[i - 1] > a[i] двигаемся дальше, если a[i - 1] < a[i], m := i - 1(поскольку мы нашли m дальше не смысла двигаться) выходим из цикла. k := i, такое что a[i] > a[m] и a[i] = min(a[i]), при i > m. Меняем местами a[m] и a[k] местами. Осталось упорядочить по возрастанию элементы, стоящие справа от нового m-го элемента, но т.к. они упорядочены по убыванию, достаточно их обернуть.
Перебор перестановок методом рекурсии
Для того, чтобы построить все перестановки для n элементов, построим все перестановки для n-1 элементов и добавим к каждой из них n-ый элемент всеми возможными n способами. Пример К перестановке 2431 элемент 5 добавим следующими способами: 24315, 24351, 24531, 25431, 52431. Для построения следующей перестановки подвинется 4, после чего снова будет двигаться 5. На протяжении всего процесса хранится информация о том, в каком направлении двигается каждый элемент.
При построении следующей перестановки на первом шаге рассматривается наибольший элемент . Если в направлении его движения еще есть, куда двигаться, передвигаем на одну позицию, это и будет следующей перестановкой. Если двигаться больше некуда (элемент стоит на краю массива и направление его движения — к краю), то меняем его направление движения, после чего «забываем» про этот элемент и строим следующую перестановку для оставшейся части массива, для этого находим в ней наибольший элемент и т.д. (повторяем все снова).