有序全排列

通过修改基本的全排列算法,实现全排列按序变化。

缺点:要求初始输入数据 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;
}

posted on 2011-04-29 17:19  明日之星  阅读(250)  评论(0)    收藏  举报