步骤一.将数组中第一个数与其之后的数互换位置得到新的排序;
步骤二.将(原排序+之前得到的所有排序的)第二个数与其之后的数互换位置得到新的排序;
步骤三.将(原排序+之前得到的所有排序的)第三个数与其之后的数互换位置得到新的排序;
以此类推……(设第n个数为k,其之后将要与其互换位置的数为b,若在该排序中,存在k或k到b之间的数等于b,则跳过此次互换。)
反例说明:
1.若在步骤二中将第二个数与第一个数互换,该排序会与原排序或步骤二中得到的某个新排序重合。
2.设k与b之间存在x等于b,k与b互换后得到的排序 = k与x互换,k再与b互换后得到的排序。
#include<stdio.h>
int a[]={21,21,4,219,29},m=5;//m为数组元素个数
void permpp(int k){
int n,b;
if(k==m-1){
n=0;
while(n<m){
printf("%d ",a[n++]);
}
printf("\n");
return;
}
permpp(k+1);
n=k+1;
while(n<m){
for(b=k;b<n;b++){
if(a[n]==a[b])break;
}
if (b==n){
b=a[k];
a[k]=a[n];
a[n]=b;
permpp(k+1);
a[n]=a[k];
a[k]=b;
}
n++;
}
}
int main(){
permpp(0);
}