全排列

来源:互联网 发布:炒外汇软件哪个好 编辑:程序博客网 时间:2024/05/10 07:52

问题描述:设有{r1,r2,...,rn}共n个元素,这n个元素中可能存在重复元素,试设计一个算法,列出这n个元素的不同排列。


参考代码:

#include<stdio.h>#include<stdlib.h>int *arr,n,count;void swap(int i,int j){int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}void print(){int m;count++;for(m=0;m<n;m++)printf("%d\t",arr[m]);putchar('\n');}void perm(int start,int end){if(start==end)print();else{for(int i=start;i<=end;i++)if(start==i||(start!=i&&arr[start]!=arr[i])){//剔除重复项swap(start,i);perm(start+1,end);swap(start,i);}}}int main(){int i,j;scanf("%d",&n);arr=(int*)malloc(sizeof(int)*n);for(i=0;i<n;i++)scanf("%d",&arr[i]);//小→大,可以轻易剔除重复排列for(i=0;i<n;i++)for(j=i+1;j<n;j++)if(arr[i]>arr[j])swap(i,j);perm(0,n-1);printf("%d\n",count);}

测试结果:


0 0