pascal 实现permute

来源:互联网 发布:完美软件 编辑:程序博客网 时间:2024/06/06 13:08

假定输入一个数字n,定义n 为从1开始的数组的长度(0<n<10),对该数组进行完全乱序排序,要求输出所有该数组的乱序排序并且没有重复。


先给出程序:

program YS;
var
a,b:array[0..26] of integer;
    j,k,n:integer;


procedure permute(i:integer);
var x,y:integer;


begin
x:=1;
while x<= n do
  begin

   if b[x]=0 then
    begin
     b[x]:=a[n-i+1];
     if(b[x]<>0) and (i=1) then
      begin

       for y:=1 to n do write(b[y]);
       writeln;
       b[x]:=0;{完成数字树,输出后最后一层排序的数字归零,重新变成未完成数字树}

      end;
     if i >1 then permute(i-1);
     if (i>1) then b[x]:=0; {若未完成数字树,则旧指针归零}
     x:=x+1;{旧指针已进行过完全排序,寻找下一个新指针位置}
    end

   else  x:=x+1;{当前位置被占用,寻找下一个位置}

  end;
end;


begin{main}

writeln('input length');
repeat
  readln(n);
  if n>=10 then writeln('bad length');
until n<10;
for k:=1 to n do begin a[k]:=k ; b[k]:=0; end;{生成原始数组和待排序数组}
permute(n);
writeln;

end.

子函数permute实现的是:a数组为初始数组,b数组为排序数组。i表示进行第i个数字的排序(第i层)。while循环的作用是从1到n查找未被先前数字覆盖的可用位置。x是指针,用于指示当前排序层的位置。i指针从a1开始,对a数组每个数字进行到b数组的安放。若所有a数组数字安放完成,则认为数字树生成完毕,进行输出,并且指针移动并生成新的数字树。

该程序进行小改动后能输出字母的permutation。


若程序有错误或改进方法,欢迎大家提出意见。

0 0