tagsOf | Salut à tous,
J'essaie de trouver un algorithme claire pour pouvoir écrire de manière facile l'algorithme des permutations dons je rappelle brièvement le principe avec un exemple:
Soit un tableau T={1,2,3} (je prend ici 3 valeurs, j'aurai pu en prendre N)
permutation (T);
123
132
213
231
312
321
Je précise que j'ai déjà trouvé des fonctions en C qui me permettent cela, je ne les comprend pas complètement, en voici un exemple:
Code :
- #include <stdio.h>
- #include <stdlib.h>
- void print(const int *v, const int size)
- {
- if (v != 0) {
- for (int i = 0; i < size; i++) {
- printf("%4d", v[i] );
- }
- printf("\n" );
- }
- } // print
- void permutation(int *Value, int N, int k)
- {
- static int level = -1;
- level = level+1;
- Value[k] = level;
- if (level == N)
- print(Value, N);
- else
- for (int i = 0; i < N; i++)
- if (Value[i] == 0)
- permutation(Value, N, i);
- level = level-1;
- Value[k] = 0;
- }
- int main()
- {
- const int N = 4;
- int Value[N];
- for (int i = 0; i < N; i++) {
- Value[i] = 0;
- }
- permutation(Value, N, 0);
- return EXIT_SUCCESS;
- }
|
J'ai trouvé également un algorithme que j'ai essayer d'implementer dont je ne saisis complètement pas la ligne en rouge:
fonction permut (tableau) /* ou un pointeur */
foreach a in tableau do print a sous_tableau=tableau - element_a if sous_tableau=1case /* test de fin de recurtion */
then print sous_tableau[0]+cr/lf
else permut(sous_tableau) /* recurtion */
end if end for end fonction
Voici mon essai d'implémentation en C:
Code :
- #include <stdio.h>
- #include <stdlib.h>
- #include <assert.h>
- int array[3]={1,2,3};
- int* sousTableau(int indice, int * tableau, int N){
- int curseur=0;
- int *sous_tableau=malloc( (N-1)*sizeof(*sous_tableau) );
- assert(sous_tableau);
- for(int i=0; i<N; i++)
- if( i != indice ){
- sous_tableau[curseur]=tableau[i];
- curseur++;
- }
- return sous_tableau;
- }
- void permutation(int * tableau, int N){
- int * sous_tableau=NULL;
- for(int i=0; i < N; i++)
- {
- printf("%d ",tableau[i]);
- sous_tableau=sousTableau(i,tableau,N);
- if( N == 2){
- printf("%d ",sous_tableau[0]);
- printf("\n" );
- }
- else
- permutation(sous_tableau, N-1);
- }
- }
- int main(void){
- permutation(array,3);
- return EXIT_SUCCESS;
- }
|
L'exécution donne le résultat inattendu suivant:
1 2 3 3 2 2 1 3 3 1 3 1 2 2 1 Si vous pensez détenir un meilleure algorithme dans le sens plus claire a la compréhension, et plus facile à implémenter, ou tous simplement si vous voyez des erreur dans cet algorithme ou dans mon implémentation, n'hésitez pas à m'en faire part, je vous serez trés reconnaissant !
Merci d'avance pour toutes votre aide !
|