Здравствуйте, fanpilot, Вы писали:
F>Подскажите вариант реализации без использования обобщённых функций.
Вариант без обобщённых функций состоит в том, чтобы скопипастить определение next_permutation (и всё, от чего он зависит) из <algorithm> и убрать оттуда слово template
А сама идея алгоритма (Д.Кнута, кстати) проста, как сибирский валенок — или как wellington boot.
Пусть перед очередной итерацией наш массив заполнен так: [q,w,e,...,r,M,Z,Y,X,...,C,B,A]
То есть, существует нестрого-убывающий хвост Z >= Y >= ... >= B >= A, отделённый от произвольной головы q,w,e... элементом M, строго меньшим Z.
(Был бы M==Z, — принадлежал бы нестрого-убывающему хвосту M>=Z>=...)
Какая перестановка будет следующей в порядке лексикографического возрастания (как если бы мы переставляли буквы в слове)?
Очевидно, что любые варианты вида [q,w,e,...,r,M]+permute{Z,Y,X,...,C,B,A} — окажутся меньше-или-равны текущему — т.к. голова у них совпадает, а любая перестановка невозрастающего подмассива (хвоста) даст меньший-или-равный подмассив.
Также очевидно, что нужно сохранить как можно более длинную голову неизменной. То есть, вовлечь в перестановку только элемент M.
Получаем [q,w,e,...,r]+minimal_permutation{M,Z,Y,X,...,C,B,A}
Наименьшая перестановка — это массив, отсортированный по возрастанию. То есть, [A,B,C,...,M,...,X,Y,Z]
next_permutation останавливается, когда весь массив оказывается отсортирован по убыванию.
Отсюда план работ
0) если длина массива 0 или 1 — то всё.
1) находим позицию im элемента M, начиная с len-2 и убывая, так, что arr[im]<arr[im+1].
Если поиск закончился неуспешно (im<0) — то всё.
2) переворачиваем подмассив arr[im+1]..arr[len-1]
(это требует аккуратности в работе с индексами)
3) находим положение ins для вставки arr[im] в arr[im+1..len-1], так, что arr[ins]>arr[im]
4) вставляем элемент arr[im] на это место, сдвигая arr[im+1..ins] влево на одну позицию
5) и говорим "не всё!"
Закодировать алгоритм — упражнение для первокурсника %)