2009-08-22 7 views
0
#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(); 
} 
+2

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

+0

yup je suppose que je l'ai réparé –

+3

Souciez-vous expliquer ce qu'est le bug? – Toad

Répondre

1

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 ..

+2

qui ne fixe pas l'algorithme. 24 résultats ne signifient pas 24 résultats corrects. –

+0

Précisément. L'algorithme est faux, simplement parce qu'il ne produit évidemment pas les temps 'n! – avakar

+0

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. –

2

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; 
} 
1

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é.

+0

+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

Questions connexes