求排列算法!

HuaRoaD 2001-06-01 08:40:00
给出 1,2,3,......,n 
求出这n个数的所有排列。
最好能有PASCAL源代码。
...全文
92 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
HuaRoaD 2001-06-04
  • 打赏
  • 举报
回复
有没有不用递归的排列算法?
starfish 2001-06-04
  • 打赏
  • 举报
回复
上述的代码是用一种方向箭头(假想的)来不断从左移到右,再从右移到左,然后得到一个个排列(可能我的表述不太清楚)。
还有一种错排方法,将n个数的排列和0~ n!-1个正整数建立一一对应关系,只要一个循环根据这种对应关系就可以输出排列,而且这种方法还给出了一种压缩编码算法。其实这就是“阶乘进制”的应用。具体可参见有关的数学书
ksxy 2001-06-04
  • 打赏
  • 举报
回复
有:
#include <iostream>
using namespace std;

int main() {

//get the size of the problem
int n;
int num = 1;
cin>>n;

//calculate num = size!
for (int i = 1; i <= n; i++)
num *= i;

//get the array
int* a = new int[n];
for (int i = 0; i < n; i++)
a[i] = i;

//generate the permutation
int j,k, temp;
int r, s;
for (int i = 0; i < num; i++) {
j = n - 1;
k = n;
while (a[j] > a[j + 1]) j--;
while (a[j] > a[k]) k--;
temp = a[j];
a[j] = a[k];
a[k] = temp;

//partition the array after j
r = n;
s = j + 1;
while (r > s) {
temp = a[r];
a[r] = a[s];
a[s] = temp;
r--;
s++;
}

//output the array, or do something else
...
}

return 0;
}
starfish 2001-06-02
  • 打赏
  • 举报
回复
program arrange;

const
MAX_N = 1000;
var
used: array [1..MAX_N] of boolean;
P: array [1..MAX_N] of integer;
n:integer;

procedure search(k:integer);
var
i:integer;
begin
if k=n+1
then begin
for i:=1 to n do write(P[i]);
writeln;
end
else for i:=1 to n do
if not used[i] then
begin
used[i] := true;
P[k] := i;
search(k+1);
used[i] := false;
end;
end;

begin
fillchar(used, sizeof(used), false);
write('input n:');readln(n);
search(1);
readln;
end.

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧