matlab的全排列问题

来源:百度知道 编辑:UC知道 时间:2024/04/28 04:59:07
想要用matlab遍历1~N的全排列,我想要逐个遍历即可,即生成一个新的排列就替代掉原来的排列,这样存储单位只要一个长为N的向量即可。
若用matlab内置的perms函数,会生成N!行的矩阵,当N超过10时,无法运算。
若用回溯法编程穷举,运算量很大。
哪位高手帮忙写个函数,每运行一次出来一个新排列,高分奉送,不胜感激!
前几天看了《组合数学》(马光思,西安电子科技大学出版社),里面介绍了一种“错位置数法”。可以新的排列替代掉原来的排列的遍历,但我不会编程,高手可以参考一下。(在该书P57)

哈哈,我用的是"递增进位制数法"(方法源自网上)

代码如下:
%%%%%%%%%%%%以下计算出新的排列%%%%%%%%%%%%%
%% Author by wacs5
%% 排列的总个数为n!
%% 在指定位置插入代码即可

%clc
%clear
n=3;
n_1=prod(1:n);
allorder_K=zeros(1,n-1);
tic
for allorder_m=1:n_1 %产生n!个排列
allorder_flag=zeros(1,n);
allorder_P=zeros(1,n);
for allorder_i=1:n-1
position=n-allorder_K(allorder_i);
allorder_j=n;
while(allorder_j>=position)
if (allorder_flag(allorder_j)==1)
position=position-1;
end
allorder_j=allorder_j-1;
end
allorder_P(position)=n+1-allorder_i;
allorder_flag(position)=1;
end
for allorder_i=1:n
if (allorder_flag(allorder_i)==0)
allorder_P(allorder_i)=1;
break;
end
end
%%%%以下更新K
for allord