#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();
}
答案 0 :(得分:2)
一些额外的材料(我有点醉了,明天我可能不得不重新编辑它,所以带上一点点盐):
Knuth和Sedgewick两人都曾介绍过排列。
查看:http://www.princeton.edu/~rblee/ELE572Papers/p137-sedgewick.pdf
对于n项你有n!排列,因此对于13个项目,您已经有6 227 020 800个排列。因此,为大量项目创建所有排列将很快变得不可能。
基本上有两组算法可用于创建排列,排名/取消排名和增量变更方法。
通过排名/取消排名,您有两种方法排名和排名。
排名将为您提供排序顺序中的排列位置。
Unrank将为您提供位于整数m的排列,其中0> = m&lt; = n!,n为您要为其创建排列项目的数量。
这适用于各种情况,例如:
创建一个随机排列(你只需要创建一个从0到n的随机数!并调用unrank(randomNumber))并获得位置randomNumber的排列。
创建序列,获得下一个排列:你有一个排列p并调用Rank(p)然后调用Unrank(rank + 1)。
增量变更方法:
这些基本上通过交换工作,比排名/取消更有效:
来自维基百科,无序生成:
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 :(得分:1)
改变这个:
for(k=0;k<(n-2);k++)
到此:
for(k=0;k<(n-1);k++)
另外,尝试使用更具描述性的变量名称......
答案 2 :(得分:1)
我不知道您的程序的重点,但您可能会尝试阅读std :: next_permutation的实现。使用循环生成所有排列有点棘手,我更喜欢使用递归。