有序全排列
通过修改基本的全排列算法,实现全排列按序变化。
缺点:要求初始输入数据 datas是有序的;
包含相同数据的 datas的全排列中会出现重复排列。
#include <stdio.h>
#include <malloc.h>
int num=0;
int n;
int *datas;
void SwapByOrder(int datas[],int k,int i,int direct)
{
int temp;
if(direct)
{
//保证交换后的子序列是有序的
temp = datas[i];
for(int j=i-1;j>=k;--j)
datas[j+1]=datas[j];
datas[k]=temp;
}
else
{
//还原为原始的序列
temp = datas[k];
for(int j=k;j<i;j++)
datas[j]=datas[j+1];
datas[i]=temp;
}
}
void PermByOrder(int datas[],int k,int m)
{
if(k>=m-1)
{
for(int i=0;i<m;++i)
printf("%d ",datas[i]);
printf("\n");
num++;
}
else
{
for(int i=k;i<m;++i)
{
SwapByOrder(datas,k,i,1);
PermByOrder(datas,k+1,m);
SwapByOrder(datas,k,i,0);
}
}
}
void readData()
{
if(scanf("%d",&n)!=EOF && n>0)
{
datas =(int *)malloc(n*sizeof(int));
for(int i=0;i<n;++i)
scanf("%d",datas+i);
}
}
int main()
{
readData();
PermByOrder(datas,0,n);
free(datas);
printf("num:%d\n",num);
return 1;
}
浙公网安备 33010602011771号