Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
int i = N - 2;
while (i >= 0 && array[i] >= array[i+1]) i = i-1;
if (i >= 0) {
int j = i+1;
while (array[i] < array[j+1]) j=j+1;
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
for (int j = i+1, k = N-1; j < k; j=j+1, k=k-1) {
int temp = array[j];
array[j] = array[k];
array[k] = temp;
}
return i>=0;
void RepSeq(T *A,int N){
for(int ind=1;;ind++){
PrintPerm(A,N);
int a=ind,p=0,j;
for(j=N;j>0;j--){
int x=a%j; a/=j;
if(x){
if(a%2) x=j-x;
swap(A+p-1+x,A+p+x);
break;
} else p+=1-a%2;
}
if(!j) break;
}
}
В вашем первом посте приведен алгоритм получения одной перестановки из другой. В алгоритме получения всех перестановок множества это только часть задачи.Я считаю своих собеседников достаточно умными, чтобы самостоятельно превратить алгоритм получения следующей перестановки в алгоритм перечисления всех перестановок.
int i;
for (i=0; i<N; i++) array[i] = i+1;
do {
print_permutation(array);
i = N - 2;
while (i >= 0 && array[i] >= array[i+1]) i = i-1;
if (i >= 0) {
int j = i+1;
while (array[i] < array[j+1]) j=j+1;
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
for (int j = i+1, k = N-1; j < k; j=j+1, k=k-1) {
int temp = array[j];
array[j] = array[k];
array[k] = temp;
}
} while (i >= 0);
for (int L=0; ; L++) {
int ind = L;
for(int a=1;a<=N;a++){
int k=ind%a;
ind/=a;
array[a-1]=array[k];
array[k]=a;
}
print_permutation(array);
if (ind > 0) break;
}
Назвать алгоритмом несколько строк кода, которые надо запустить N! раз, я считаю не совсем корректным.
Алгоритмы не сравнивают по количеству строк кода, это не имеет смысла.
Лист1.Cells.Clear или MsgBox "stop calc" void Gen(int[] array,int N,int ind){
for(int a=1;a<=N;a++){
int k=ind%a;
ind/=a;
array[a-1]=array[ind];
array[ind]=a;
}
}
swap(array[a-1], array[k])? void Gen(int[] array,int N,int ind){
for(int a=1;a<=N;a++){
int k=ind%a;
ind/=a;
array[a-1]=array[k];
array[k]=a;
}
}
for(i=1; i<n; ++i)
swap( arr[i], arr[rand()%(i+1)] );
for(i=1; i<n; ++i)
swap( arr[i], arr[perm[i]] );
for(i=1; i<n; ++i)
{
perm[i] = k % (i+1);
k /= (i+1);
}
for(i=1; i<n; ++i)
{
swap( arr[i], arr[k % (i+1)] );
k /= (i+1);
}
$a='876543210';
$b=strrev($a);
$n=strlen($a);
while ($a !=$b) {
for($i=0; $i < $n; $i++) {
if ($a[$i] < $a[$i-1]) {
for($j=0; $j < $n; $j++) {
if ($a[$j] > $a[$i]) {
$c=$a[$j];
$a[$j]=$a[$i];
$a[$i]=$c;
$x=strrev(substr($a, 0, $i));
$y=substr($a, $i);
print $a=$x.$y;
print ‘<br/>’;
break 2;
}
}
}
}
}
Нерекурсивный алгоритм генерации перестановок