#include<cstdio>
#include<cstdlib>
#define MAXN 10
void qsort(int a[], int l, int r){
if(l>=r) return;
int i=l, j=r, x=a[(i+j)>>1]; a[(i+j)>>1] = a[i]; a[i] = x;
do{
while(i<j && a[j] >= x) j--; if(i<j) {a[i] = a[j]; i++;}
while(i<j && a[i] <= x) i++; if(i<j) {a[j] = a[i]; j--;}
}while(i!=j);
a[i] = x;
qsort(a, l, i-1); qsort(a, i+1, r);
}
void print_permutation(int n, int P[], int A[], int cur){
if(cur == n) {
for(int i=0; i<n; i++) printf("%d ",A[i]);
putchar('\n');
}
else for(int i=0; i<n; i++) if(!i || P[i] != P[i-1]) {
int c1 = 0, c2 = 0;
for(int j=0; j<cur; j++) if(A[j] == P[i]) c1++;
for(int j=0; j<n; j++) if(P[j] == P[i]) c2++;
if(c1 < c2) {
A[cur] = P[i];
print_permutation(n, P, A, cur+1);
}
}
}
int main(){
int n, A[MAXN], P[MAXN];
scanf("%d",&n);
for(int i = 0; i < n; i++) scanf("%d",&P[i]);
//n = 4;
qsort(P,0,n-1);
for(int i= 0;i< n;i++) printf("%d ",P[i]);
print_permutation(n, P, A, 0);
return 0;
}
//10 2 4 0 3 1 9 7 6 2 7
【枚举排序】生成可重集排序
最新推荐文章于 2024-03-04 20:42:33 发布