【枚举排序】生成可重集排序

来源:互联网 发布:央视网络电视台直播 编辑:程序博客网 时间:2024/05/29 13:36
#include<cstdio>#include<cstdlib>#define MAXN 10void 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

0 0
原创粉丝点击