码迷,mamicode.com
首页 > 编程语言 > 详细

排列的生成算法

时间:2015-05-05 14:08:09      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

字典序法

  对于按字典的顺序给出的排列(p=p(1)p(2)p(3)p(4)…p(n)),由一个排列生成下一个排列的算法如下:

  (1)求满足关系式p(j-1)<p(j)的j的最大值设为i,即 i=max{j|p(j-1)<p(j)}

   (2)求满足关系式p(i-1)<p(k)的k的最大值设为j,即 j=max{k|p(i-1)<p(k)}

   (3)p(i-1)与p(j)互换位置,得到p‘=p(1)p(2)…p(n)

   (4)在p‘=p(1)p(2)…p(i-1)p(i)p(i+1)…p(n)中,把p(i)p(i+1)…p(n)部分逆序,所得p=p(1)p(2)…p(i-1)p(n)p(n-1)…p(i)序列就是所求。其中j的意义是排列的下标,对于一个有n个数的排列,j的范围是从0到n。p(j)就是这个排列的第j个数。

 

  附源码:

 

 

  var

 p:array[0..1000]of longint;

 i,n,j,k,t:longint;

begin

  readln(n);

  for i:=1 to n do p[i]:=i;

  repeat

    for i:=1 to n do write(p[i],‘ ‘); writeln;

    for j:=1 to n do if p[j-1]<p[j] then i:=j;

    for k:=1 to n do if p[i-1]<p[k] then j:=k;

    t:=p[i-1];  p[i-1]:=p[j];  p[j]:=t;

    for k:=i to (i+n)shr 1 do

    begin

      t:=p[k]; p[k]:=p[n-k+i]; p[n-k+i]:=t;

    end;

  until i=1;

end.

排列的生成算法

标签:

原文地址:http://www.cnblogs.com/cxvdzxhb/p/4478829.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!