算法之字典排序法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法之字典排序法
2. 字典序法
字典序法就是按照字典排序的思想逐一产生所有排列.
设想要得到由1,2,3,4以各种可能次序产生出4!个“单词”. 肯定先排1234, 再排1243, 下来是1324, 1342, …., 4321.
分析这种过程, 看如何由一个排列得到下一个排列, 并给出严格的数学描述.
例2.3 设有排列(p) =2763541, 按照字典式排序, 它的下一个排列是?
(q) =2764135.
(1) 2763541 [找最后一个正序35]
(2) 2763541 [找3后面比3大的最后一个数]
(3) 2764531 [交换3,4的位置]
(4) 2764135 [把4后面的531反序排列为
135即得到最后的排列(q)]
求(p)=p1⋯p i-1p i…p n的下一个排列(q):
(1) 求i=max{j⎪ p j-1
(2) 求j=max{k⎪ p i-1
(3) 互换p i-1与p j得
p1…p i-2 p j p i p i+1⋯p j-1 p i-1 p j+1…p n
(4) 反排p j后面的数得到(q):
p1…p i-2 p j p n⋯p j+1p i-1p j-1 ….p i+1 p i
例2.4 设S={1,2,3,4}, 用字典序法求出S的全部排列. 解1234, 1243, 1324, 1342, 1423, 1432,
2134, 2143, 2314, 2341, 2413, 2431,
3124, 3142, 3214, 3241, 3412, 3421,
4123, 4132, 4213, 4231, 4312, 4321.
字典排序法C++代码:
#include
void repailie(int *a,int n,int dp)
{
int *bb=new int[n-dp];
int *cc=new int[n-dp];
int ti=0;
for(int i=dp+1;i { bb[ti++]=a[i]; } for(int j=0;j { a[j+dp+1]=bb[ti-j-1]; } //cout< //cout< } int main(void) { int n; cout<<"请输入1至无穷大的数"< cin>>n; int *a=new int[n]; int p=1;//n的阶层 int q=1;//循环记录 int b,c;//最后一对正序 int bi,ci;//记录b和c的位置 int d;//最后大于b者 int di;//记录d的位置 for (int o=1;o<=n;o++) { p=p*o; //cout< } for (int i=0;i { a[i]=i+1; cout< } cout< while(q { for(int j=n-1;j>=0;j--) { if(a[j-1] { b=a[j-1]; bi=j-1; c=a[j]; ci=j; break; } } //cout< for(int k=n-1;k>=0;k--) if (a[k]>b) { d=a[k]; di=k; break; } } //cout< for(int l=0;l { if(l==di) { a[l]=b; //cout< } if(l==bi) { a[l]=d; //cout< } repailie(a,n,bi); for (int m=0;m { cout< } cout< ++q; } } 运行结果图: