[问题描述] 用生成法求出1,2,…,r的全排列(r<=8)(15分)(每个点3分)
[算法过程] 用数组:a:array[1..r]of integer ;表示排列;
初始化时,a[I]:=1(I=1,2,….f)
设中间的某一个排列为a[1],a[2],…a[r]
则求出下一个排列的算法为:
(1) 从后面向前找,直到找到一个顺序为止
(设下标为j-1,则a[j-1]<a[j]
(2) 从a[j]- a[r]中,找出一个a[k]比a[j-1]大的最小元素
(3) 将a[j-1]与a[K]交换
(4) 将a[j],a[j+1]……a[r]由小到大排序。
program exGp4;
const r=7;
var
n,i,s,k,j,i1,t:intger;
a :array[1..r]of integer;
procedure print1;
var
ik:integer;
begin
for ik:=1 to r do write(a[ik]:8);writeln;
end
begin
for i:=1 to r do a[i]:=i ;
print1;
s:=1;
for i:=2 to r do s:=s*i;
s:=s-1;
for i:= 1 to s do
begin
j:=r;
while a[j-1]>a[j] do j:=j-1;
k:=j;
for i1:=j+1 to r do
if (a[i1]>a[j-1]) and (a[i1]<a[k]) then k:=i1;
t:=a[j-1];a[j-1]:=a[k];a[k]:=t;
for i1:=j to r-1 do
for k:=i1+1 to r do
if a[i1]>a[k] then
begin
t:=a[i1];a[i1]:=a[k];a[k]:=t;
end;
print1;
end;
end.