当前位置:首页 » 操作系统 » 圈排列算法

圈排列算法

发布时间: 2022-11-01 12:18:25

㈠ 关于全排列算法实现(请帮忙注释这些代码)

全排列用的是
置换算法,
算法这东西重在理解。具体代码并不那么重要。
全排列是将一组数按一定顺序进行排列,如果这组数有n个,那么全排列数为n!个。现以{1,
2,
3,
4,
5}为
例说明如何编写全排列的递归算法。
1、首先看最后两个数4,
5。
它们的全排列为4
5和5
4,
即以4开头的5的全排列和以5开头的4的全排列。
由于一个数的全排列就是其本身,从而得到以上结果。
2、再看后三个数3,
4,
5。它们的全排列为3
4
5、3
5
4、
4
3
5、
4
5
3、
5
3
4、
5
4
3
六组数。
即以3开头的和4,5的全排列的组合、以4开头的和3,5的全排列的组合和以5开头的和3,4的全排列的组合.
从而可以推断,设一组数p
=
{r1,
r2,
r3,
...
,rn},
全排列为perm(p),pn
=
p
-
{rn}。
因此perm(p)
=
r1perm(p1),
r2perm(p2),
r3perm(p3),
...
,
rnperm(pn)。当n
=
1时perm(p}
=
r1。
为了更容易理解,将整组数中的所有的数分别与第一个数交换,这样就总是在处理后n-1个数的全排列。
算法如下:
#include
<stdio.h>
int
n
=
0;
void
swap(int
*a,
int
*b)
{
int
m;
m
=
*a;
*a
=
*b;
*b
=
m;
}
void
perm(int
list[],
int
k,
int
m)
{
int
i;
if(k
>
m)
{
for(i
=
0;
i
<=
m;
i++)
printf("%d
",
list[i]);
printf("\n");
n++;
}
else
{
for(i
=
k;
i
<=
m;
i++)
{
swap(&list[k],
&list[i]);
perm(list,
k
+
1,
m);
swap(&list[k],
&list[i]);
}
}
}
int
main()
{
int
list[]
=
{1,
2,
3,
4,
5};
perm(list,
0,
4);
printf("total:%d\n",
n);
return
0;
}

㈡ 如何生成一串数字的全排列 算法

个人一点见解,希望对你有所帮助。
依我之见,你的对换部分出了一点点问题。只要作如下修改即可:
1、exchange 改为:
procere exchange(l,r:integer);
var
t,len:integer;
begin
if l=r then exit;
len:=r-l+1;
len:=len div 2;
for i:=1 to len do
begin
t:=a[l+i-1];
a[l+i-1]:=a[r-i+1];
a[r-i+1]:=t;
end;
end;
2、主过程中exchange(p,n)改为exchange(i+1,n)。

㈢ 全排列的公式

全排列数f(n)=n!(定义0!=1) 1,2,3
1,3,2
2,1,3
2,3,1
3,2,1
3,1,2
这是由于算法只是考虑到了如何输出全排列,而没有考虑到换位是否有问题。
所以我提出了解决方案,就是换位函数修改下
如 1 2 3 换位的话 ,不应该直接 3 2 1这样 ,
让3和1直接换位; 而是让3排在最前后 ,1 2 依次向后 以下介绍全排列算法四种:
(A)字典序法
(B)递增进位制数法
(C)递减进位制数法
(D)邻位对换法 对给定的字符集中的字符规定了一个先后关系,在此基础上规定两个全排列的先后是从左到右逐个比较对应的字符的先后。
[例]字符集{1,2,3},较小的数字较先,
这样按字典序生成的全排列是:123,132,213,231,312,321。
[注意] 一个全排列可看做一个字符串,字符串可有前缀、后缀。
1)生成给定全排列的下一个排列 所谓一个的下一个就是这一个与下一个之间没有其他的。这就要求这一个与下一个有尽可能长的共同前缀,也即变化限制在尽可能短的后缀上。
[例]839647521是1--9的排列。
1—9的排列最前面的是123456789,最后面的是987654321,从右向左扫描若都是增的,就到987654321,也就没有下一个了。否则找出第一次出现下降的位置。 1)由排列求中介数 在字典序法中,中介数的各位是由排列数的位决定的.中介数位的下标与排列的位的下标一致。
在递增进位制数法中,中介数的各位是由排列中的数字决定的。即中介数中各位的下标与排列中的数字(2—n)一致。可看出n-1位的进位链。 右端位逢2进1,右起第2位逢3进1,…,
右起第i位逢i+1进1,i=1,2,…,n-1. 这样的中介数我们称为递增进位制数。 上面是由中介数求排列。
由序号(十进制数)求中介数(递增进位制数)如下:
m=m1,0≤m≤n!-1
m1=2m2+kn-1,0≤kn-1≤1
m2=3m3+kn-2,0≤kn-2≤2
……………
mn-2=(n-1)mn-1+k2,0≤k2≤n-2
mn-1=k1,0≤k1≤n-1
p1p2…pn←→(k1k2…kn-1)↑←→m
在字典序法中由中介数求排列比较麻烦,我们可以通过另外定义递增进位制数加以改进。
为方便起见,令ai+1=kn-1,i=1,2,…,n-1
(k1k2…kn-1)↑=(anan-1…a2)↑
ai:i的右边比i小的数字的个数
在这样的定义下,
有839647521←→(67342221)↑
(67342221)↑+1=(67342300)↑←→849617523
6×8+7)×7+3)×6+4)×5+2)×4+2)×3+2)×2+1 =279905
由(anan-1…a2)↑求p1p2…pn。
从大到小求出n,n-1,…,2,1的位置
_ ... _ n _ _ …_ (an个空格)
n的右边有an个空格。
n-1的右边有an-1个空格。
…………
2的右边有a2个空格。
最后一个空格就是1的位置。 在递增进位制数法中,中介数的最低位是逢2进1,进位频繁,这是一个缺点。
把递增进位制数翻转,就得到递减进位制数。 (anan-1…a2)↑→(a2a3…an-1an)↓
839647521→ (12224376)↓
(12224376)↓=1×3+2)×4+2)×5+2)×6+4)×7+3)×8+7)×9+6=340989
[注意]求下一个排列十分容易 递减进位制数法的中介数进位不频繁,求下一个排列在不进位的情况下很容易。
这就启发我们,能不能设计一种算法,下一个排列总是上一个排列某相邻两位对换得到的。
递减进位制数字的换位是单向的,从右向左,而邻位对换法的换位是双向的。 这个算法可描述如下:
对1—n-1的每一个偶排列,n从右到左插入n个空档(包括两端),生成1—n的n个排列。
对1—n-1的每一个奇排列,n从左到右插入n个空档,生成1—n的n个排列。
对[2,n]的每个数字都是如此。
839647521
字典序法 递增进位制法 递减进位制法 邻位对换法
下一个 839651247 849617523 893647521 836947521
中介数 72642321↑ 67342221↑ 12224376↓ 10121372↓
序 号 297191 279905 340989 203393

㈣ a43排列组合公式是什么

从四个元素中选三个元素的排列数 为:A43=4×3×2=24。

从四个元素中选三个元素的组合数为 :C43=4×3×2/(3×2×1)=4。

从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起来,叫做从n个不同元素中取出m个元素的一个排列。当m=n时所有的排列情况叫全排列。

公式:全排列数f(n)=n!(定义0!=1)

以下介绍全排列算法四种:

1、字典序法

2、递增进位制数法

3、递减进位制数法

4、邻位对换法

用具体的例子来理解上面的定义:4种颜色按不同颜色,进行排列,有多少种排列方法,如果是6种颜色呢。从6种颜色中取出4种进行排列呢。

解:

A(4,4)=4x(4-1)x(4-2)x(4-3)x(4-4+1)=4x1x2x3x1=24。

A(6,6)=6x5x4x3x2x1=720。

A(6,4)=6!/(6-4)!=(6x5x4x3x2x1)/2=360。

㈤ 全排列递归算法

希望我的答复可以帮助你加深理解:

第一,perm函数中的条件for(int i=k;i<=m;i++)应更正为 for(int i=k;i<m;i++)

第二,你可以在核心步骤的前后打印有关变量的值,分析查看每一步的具体执行情况,这是编程调试的重要能力,要加强。
第三,以下是我提供的附件程序及运行结果(以1,2,3这个数组的全排列),可辅助分析:

1. 程序源码=================================================
#include <stdio.h>
#include <stdlib.h>
int N,P=0;

void swap(int a[],int i,int j)
{
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}

void perm(int a[],int k,int m,int pk,int pm)
{
int i;
/*k为中间变量,m初始化为参与排列元素的起始坐标和终止坐标
pk,pm分别表示参与排列元素的起始坐标和终止坐标,整个递归过程保持不变*/
if(k==m)
{
printf("----->perm %d :\n",P/N+1);/*打印提示*/
for(i=pk;i<pm;i++)
{
printf("%d ",a[i]);
P=P+1;
}
printf("\n\n");
}
else
{
for(i=k;i<m;i++)
{
printf("a %d,%d,%d,%d,%d\n",i,k,a[0],a[1],a[2]);
swap(a,k,i);
printf("b %d,%d,%d,%d,%d\n",i,k,a[0],a[1],a[2]);
perm(a,k+1,m,pk,pm);
printf("c %d,%d,%d,%d,%d\n",i,k,a[0],a[1],a[2]);
swap(a,k,i);
printf("d %d,%d,%d,%d,%d\n",i,k,a[0],a[1],a[2]);
}
}
}

int main()
{
/*调节以下N值及对应数组内容,可打印对应数组对应的全排列*/
N=3;
int t[]={1,2,3};
/*调节以上N值及对应数组内容,可打印对应数组对应的全排列*/

perm(t,0,N,0,N);
printf("----->Over!\n");/*打印提示*/
system("pause");
return 0;
}

2.打印结果 ============================================================

a 0,0,1,2,3
b 0,0,1,2,3
a 1,1,1,2,3
b 1,1,1,2,3
a 2,2,1,2,3
b 2,2,1,2,3
----->perm 1 :
1 2 3

c 2,2,1,2,3
d 2,2,1,2,3
c 1,1,1,2,3
d 1,1,1,2,3
a 2,1,1,2,3
b 2,1,1,3,2
a 2,2,1,3,2
b 2,2,1,3,2
----->perm 2 :
1 3 2

c 2,2,1,3,2
d 2,2,1,3,2
c 2,1,1,3,2
d 2,1,1,2,3
c 0,0,1,2,3
d 0,0,1,2,3
a 1,0,1,2,3
b 1,0,2,1,3
a 1,1,2,1,3
b 1,1,2,1,3
a 2,2,2,1,3
b 2,2,2,1,3
----->perm 3 :
2 1 3

c 2,2,2,1,3
d 2,2,2,1,3
c 1,1,2,1,3
d 1,1,2,1,3
a 2,1,2,1,3
b 2,1,2,3,1
a 2,2,2,3,1
b 2,2,2,3,1
----->perm 4 :
2 3 1

c 2,2,2,3,1
d 2,2,2,3,1
c 2,1,2,3,1
d 2,1,2,1,3
c 1,0,2,1,3
d 1,0,1,2,3
a 2,0,1,2,3
b 2,0,3,2,1
a 1,1,3,2,1
b 1,1,3,2,1
a 2,2,3,2,1
b 2,2,3,2,1
----->perm 5 :
3 2 1

c 2,2,3,2,1
d 2,2,3,2,1
c 1,1,3,2,1
d 1,1,3,2,1
a 2,1,3,2,1
b 2,1,3,1,2
a 2,2,3,1,2
b 2,2,3,1,2
----->perm 6 :
3 1 2

c 2,2,3,1,2
d 2,2,3,1,2
c 2,1,3,1,2
d 2,1,3,2,1
c 2,0,3,2,1
d 2,0,1,2,3
----->Over!
请按任意键继续. . .

㈥ 全排列递归算法P(m,n)

#include<stdio.h>
main()
{
int i,j,k,m;
for(i='A';i<='G';i++)
for(j='A';j<='G';j++)
for(k='A';k<='G';k++)
for(m='A';m<='G';m++)
printf("%c%c%c%c",i,j,k,m);
}

注意这里在输出的时候没有使用printf("%c%c%c%c\n",i,j,k,m)换行符,是因为输出的数据太多,会显示不下

㈦ VB全排列算法。

新建一个工程,在窗体上新建一个text1,一个command1,把以下代码复制到工程中运行试试

OptionExplicit

PrivateList()AsString

Publicindex&,tmp$

PrivateSubCommand1_Click()

ReDimList(Len(Trim(Form1.Text1.Text)))

Forindex=1ToLen(Trim(Form1.Text1.Text))

List(index)=Mid(Form1.Text1.Text,index,1)

Nextindex

PermList,1,Len(Trim(Form1.Text1.Text))

EndSub

PrivateSubForm_Load()

Form1.AutoRedraw=True

EndSub

PublicFunctionSwap(ByRefNum1AsString,ByRefNum2AsString)'交换两个数

tmp=Num1

Num1=Num2

Num2=tmp

EndFunction

PublicFunctionPerm(ByRefListTar()AsString,ByValkAsLong,ByValmAsLong)'全排列函数

Dimi&

Ifk>mThen

Fori=1Tom

PrintListTar(i);

Nexti

Print

Else

Fori=kTom

SwapListTar(k),ListTar(i)

PermListTar,k+1,m

SwapListTar(k),ListTar(i)

Nexti

EndIf

EndFunction

运行效果

㈧ C++全排列怎么弄

你的全排列算法不成立,我给你一个全排列的例子,你看看吧.

#include<iostream>
#include<cstring>
usingnamespacestd;
staticintcount=0;
voidSwap(char*a,char*b)
{
chartmp=*a;
*a=*b;
*b=tmp;
}
voidAllRange(char*pszStr,intk,intm)
{
if(k==m)
{
count++;
cout<<pszStr<<endl;
}
else
{
for(inti=k;i<=m;i++)
{
Swap(pszStr+i,pszStr+k);
AllRange(pszStr,k+1,m);
Swap(pszStr+i,pszStr+k);
}
}
}
intmain()
{
intn;
cin>>n;
char*szTextStr;
sprintf(szTextStr,"%d",n);
cout<<szTextStr<<"的全排列如下:"<<endl;
AllRange(szTextStr,0,strlen(szTextStr)-1);
cout<<"共"<<count<<"个"<<endl;
return0;
}

㈨ 全排列计算公式是什么

全排列公式:全排列数f(n)=n!(定义0!=1)。

全排列是从从N个元素中取出M个元素,并按照一定的规则将取出元素排序,我们称之为从N个元素中取M个元素的一个排列,当M=N时,即从N个元素中取出N个元素的排列。

以最常见的全排列为例,用 S(A)表示集合 A 的元素个数。用 1、2、3、 4、5、6、7、8、9 组成数字不重复的九位数。

则每一个九位数都是集合 A 的一个元素,集合 A 中共有 9个元素,即 S(A)=9。如果集合 A 可以分为若干个不相交的子集,则 A 的元素等于各子集元素之和。

邻位对换法

递减进位制数法的中介数进位不频繁,求下一个排列在不进位的情况下很容易。

这就启发我们,能不能设计一种算法,下一个排列总是上一个排列某相邻两位对换得到的。

递减进位制数字的换位是单向的,从右向左,而邻位对换法的换位是双向的。 这个算法可描述如下:

对1—n-1的每一个偶排列,n从右到左插入n个空档(包括两端),生成1—n的n个排列。

对1—n-1的每一个奇排列,n从左到右插入n个空档,生成1—n的n个排列。

对[2,n]的每个数字都是如此。

㈩ 求遍历全排列的算法

全排列的生成算法就是对于给定的字符集,用有效的方法将所有可能的全排列无重复无遗漏地枚举出来。

常见的有四种全排列算法:
(A)字典序法
(B)递增进位制数法
(C)递减进位制数法
(D)邻位对换法

这里着重介绍字典序法

对给定的字符集中的字符规定了一个先后关系,在此基础上规定两个全排列的先后是从左到右逐个比较对应的字符的先后。

[例]字符集{1,2,3},较小的数字较先,这样按字典序生成的全排列是:123,132,213,231,312,321。

[注意] 一个全排列可看做一个字符串,字符串可有前缀、后缀。

1)生成给定全排列的下一个排列 所谓一个的下一个就是这一个与下一个之间没有其他的。这就要求这一个与下一个有尽可能长的共同前缀,也即变化限制在尽可能短的后缀上。

[例]839647521是1--9的排列。1—9的排列最前面的是123456789,最后面的是987654321,从右向左扫描若都是增的,就到了987654321,也就没有下一个了。否则找出第一次出现下降的位置。

热点内容
谷歌play商店如何连接服务器 发布:2025-05-13 17:38:11 浏览:480
ssl认证服务器搭建 发布:2025-05-13 17:33:42 浏览:890
cpul2缓存 发布:2025-05-13 17:32:09 浏览:450
编译是语言的特点 发布:2025-05-13 17:31:36 浏览:583
原神怎么看服务器版本 发布:2025-05-13 17:09:14 浏览:73
java连接符 发布:2025-05-13 17:05:44 浏览:57
hadoop删除文件夹 发布:2025-05-13 17:00:14 浏览:509
sql数据库远程备份 发布:2025-05-13 16:48:13 浏览:528
app什么情况下找不到服务器 发布:2025-05-12 15:46:25 浏览:714
php跳过if 发布:2025-05-12 15:34:29 浏览:467