Вычислительный минималистический подход (написанный на псевдокоде в стиле C):
function perm(list,i){
for(a=list.length;a;a--){
list.switch(a-1,i mod a);
i=i/a;
}
return list;
}
Обратите внимание, что реализации, основанные на удалении элементов из исходного списка, как правило, выполняются за O (n ^ 2) времени, в лучшем случае O (n * log (n)), учитывая специальную реализацию списка стилей дерева, предназначенную для быстрой вставки и удаления элементы списка.
Приведенный выше код, вместо того, чтобы сжимать исходный список и поддерживать его в порядке, просто перемещает элемент из конца в вакантное место, по-прежнему создает идеальное отображение 1: 1 между индексом и перестановкой, чуть более скремблированный, но в чистое время O (n).