產生全排列的字典序演算法

來源:互聯網
上載者:User

標籤:blog   http   io   ar   strong   for   2014   sp   代碼   

字典序演算法如下:
  設P是1~n的一個全排列:p=p1p2......pn=p1p2......pj-1pjpj+1......pk-1pkpk+1......pn
  1)從排列的右端開始,找出第一個比右邊數字小的數位序號j(j從左端開始計算),即 j=max{i|pi<pi+1}
  2)在pj的右邊的數字中,找出所有比pj大的數中最小的數字pk,即 k=min{pk|pk>pj,k>i}
  3)對換pi,pk
  4)再將pj+1......pk-1pkpk+1pn倒轉得到排列p’’=p1p2.....pj-1pjpn.....pk+1pkpk-1.....pj+1,這就是排列p的下一個下一個排列。
  例如839647521是數字1~9的一個排列。從它產生下一個排列的步驟如下:
  自右至左找出排列中第一個比右邊數字小的數字4 839647521
  在該數字後的數字中找出比4大的數中最小的一個5 839647521
  將5與4交換 839657421
  將7421倒轉 839651247
  所以839647521的下一個排列是839651247。
  我把自己寫的原始碼貼上來供大家學習:

#include<stdio.h>
#include<string.h>
int fact(int n);
void sort(char s[]);
void main()
{
int n,i;
char s[1000];
scanf("%d",&n);
for(i=0;i<n;i++)
s[i]=i+1+‘0‘;
s[i]=‘\0‘;
for(i=0;i<fact(n);i++)
{
printf("%s\n",s);
sort(s);//產生下一個排列數
}

}

int fact(int n)
{
int fact=1,i;
for(i=2;i<=n;i++)
fact=fact*i;
return fact;
}
void sort(char s[])
{
int len,i,j,tem,min;
len=strlen(s);
for(i=len-1;i>0;i--)
if(s[i-1]<s[i])
break;
min=i;
for(j=i+1;j<len;j++)
if(s[j]>s[i-1]&&s[j]<s[min])
min=j;
tem=s[i-1];
s[i-1]=s[min];
s[min]=tem;
for(j=i;j<(len+i)/2;j++)
{
tem=s[j];
s[j]=s[len-1+i-j];
s[len-1+i-j]=tem;
}
}

 

運行結果:

產生全排列的字典序演算法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.