#include<stdio.h>
#include<conio.h>
main()
{
int i,j,k,x,y,n=4,a[]={1,2,3,4}; //n is the length of the array
for(i=0;i<n;i++)
{
for(k=0;k<(n-2);k++)
{
for(j=(n-1-k);j>=1;j--)
{
y=a[j];
a[j]=a[j-1];
a[j-1]=y;
for(x=0;x<n;x++)
{
printf("%d",a[x]);
}
printf("\t");
}
}
}
getch();
}
Répondre
Modifier ceci:
for(k=0;k<(n-2);k++)
à ceci:
for(k=0;k<(n-1);k++)
Aussi, essayez d'utiliser des noms de variables descriptives plus ..
qui ne fixe pas l'algorithme. 24 résultats ne signifient pas 24 résultats corrects. –
Précisément. L'algorithme est faux, simplement parce qu'il ne produit évidemment pas les temps 'n! – avakar
Je sais que l'algorithme du demandeur n'est pas correct, mais il ne demandait pas d'exactitude; il nous demandait de trouver le "bug" qui générait 20 permutations au lieu de 24, ce que j'ai fait. Pour tout ce que je sais, il a une très bonne raison de vouloir utiliser cet algorithme particulier. –
Du matériel supplémentaire (je suis un peu bourré, je vais probablement devoir rééditer ça demain, alors prenez-le avec un grain de sel):
Knuth et Sedgewick ont tous deux couvert les permutations il y a des éons.
Jetez un oeil à: http://www.princeton.edu/~rblee/ELE572Papers/p137-sedgewick.pdf
Pour n articles que vous avez n! permutations, donc pour 13 éléments, vous avez déjà 6 227 020 800 permutations. Donc, créer toutes les permutations pour un grand nombre d'objets deviendra vite impossible.
Il existe fondamentalement deux ensembles d'algorithmes permettant de créer des permutations, des classements/exclusions et des méthodes de changement incrémentiel.
Avec le classement/l'exclusion, vous avez deux méthodes classées et non classées. Rank vous donnera la position d'une permutation dans l'ordre de génération.
Unrank vous donnera la permutation qui est à entier m, avec 0> = m = < n! et n le nombre d'éléments pour lesquels vous souhaitez créer des permutations.
Ceci est utile pour une variété de cas tels que:
Création d'une permutation aléatoire (vous suffit de créer un nombre aléatoire de 0 à n et appelez unrank (randomNumber)!) Et obtenez la permutation à randomNumber position.
Création de séquences, obtention de la permutation suivante: Vous avez une permutation p et appelez Rank (p) puis Unrank (rang + 1).
méthodes de changement progressif:
Ceux-ci fonctionnent essentiellement grâce à l'échange et sont plus efficaces que le classement/unranking:
De wikipedia, génération non numérotée:
function permutation(k, s) {
for j = 2 to length(s) {
swap s[(k mod j) + 1] with s[j]; // note that our array is indexed starting at 1
k := k/j; // integer division cuts off the remainder
}
return s;
}
Je ne sais pas le point de votre programme, mais vous pouvez essayer de lire l'implémentation de std :: next_permutation. Générer toutes les permutations avec des boucles est un peu difficile et je préfère utiliser la récursivité.
+1, bien que je ne pense pas qu'un débutant en C sera heureux d'analyser du code C++ basé sur des templates utilisant des itérateurs. Il y a, cependant, un bel article sur 'next_permutation': http://marknelson.us/2002/03/01/next-permutation/ – avakar
Je pense que quelque chose s'est mal passé lorsque vous avez soumis votre question. Le formatage est foiré et il manque du code. Pouvez-vous résoudre votre question? – Lucas
yup je suppose que je l'ai réparé –
Souciez-vous expliquer ce qu'est le bug? – Toad