Permutations: Difference between revisions
Content added Content deleted
Line 1,065: | Line 1,065: | ||
=={{header|C}}== |
=={{header|C}}== |
||
Non-recursive algorithm to generate all permutation. |
Non-recursive algorithm to generate all permutation. It prints objects in lexicographical order. A paper here: |
||
[https://habr.com/post/354790/] |
|||
<lang c> |
|||
#include <stdio.h> |
|||
int main (int argc, char *argv[]) { |
|||
//here we check arguments |
|||
if (argc < 2) { |
|||
printf("Enter an argument. Example 1234 or dcba:\n"); |
|||
return 0; |
|||
} |
|||
//it calculates an array's length |
|||
int x; |
|||
for (x = 0; argv[1][x] != '\0'; x++); |
|||
//buble sort the array |
|||
int f, v, m; |
|||
for(f=0; f < x; f++) { |
|||
for(v = x-1; v > f; v-- ) { |
|||
if (argv[1][v-1] > argv[1][v]) { |
|||
m=argv[1][v-1]; |
|||
argv[1][v-1]=argv[1][v]; |
|||
argv[1][v]=m; |
|||
} |
|||
} |
|||
} |
|||
//it calculates a factorial to stop the algorithm |
|||
char a[x]; |
|||
int k=0; |
|||
int fact=k+1; |
|||
while (k!=x) { |
|||
a[k]=argv[1][k]; |
|||
k++; |
|||
fact = k*fact; |
|||
} |
|||
a[k]='\0'; |
|||
//Main part: here we permutate |
|||
int i, j; |
|||
int y=0; |
|||
char c; |
|||
while (y != fact) { |
|||
printf("%s\n", a); |
|||
i=x-2; |
|||
while(a[i] > a[i+1] ) i--; |
|||
j=x-1; |
|||
while(a[j] < a[i] ) j--; |
|||
c=a[j]; |
|||
a[j]=a[i]; |
|||
a[i]=c; |
|||
i++; |
|||
for (j = x-1; j > i; i++, j--) { |
|||
c = a[i]; |
|||
a[i] = a[j]; |
|||
a[j] = c; |
|||
} |
|||
y++; |
|||
} |
|||
} |
|||
</lang> |
|||
=={{header|C}}== |
|||
Non-recursive algorithm to generate all permutation. It prints them from right to left. |
|||
See a full paper here: |
|||
[https://habrahabr.ru/post/330690/] |
[https://habrahabr.ru/post/330690/] |
||
<lang c> |
<lang c> |