生成下一个排列的算法有很多中,用递归来实现是最简单,最明了的。我下面介绍的不是按照递归了实现而是从实际问题分析,总结出的规律。
我们知道对于排列a1a2a3......an,如果aj < aj+1,那么交换aj,aj+1那么得到就是一个更大的排列,但是满足这个条件的有很多,到底因该选择哪一个
怎么判断,下一个排列的条件,这里我们贪心点,我们选择最后一个满足aj < aj+1的j,因为越向后面的交换后一定更靠近下一个排列,是吧,所以选择最后
一个刚好是,接着我们从第j+1,n位中选择大于aj最小的ak,把它和aj交换,这时从j+1位开始,依然保持着递减的次序,所以我们把它按照递增的顺序排列。
其实在我们选择j后,就一定有aj + 1> a j +2.....an,因为aj 是最后一个不满足这个等式的!这样就生成了下一个排列,我们只需把这代码运行n! - 1次,就能得到所有
排列。
#include <stdio.h>
#define MAXN 100
int A[MAXN];
int main(){
int m;
while(scanf("%d",&m) != EOF){//输入个数
for(int i = 1; i <= m ;i++){
scanf("%d",A + i);
}
int j = m - 1;
while(A[j] > A[j + 1])//找最后一个j
j--;
int k = m;
while(A[k] < A[j])//找比A【j】大的最小数
k--;
int temp = A[k];
A[k] = A[j];
A[j] = temp;
int r = j + 1;
int s = m;
while(r < s){//排序
int temp = A[r];
A[r++] = A[s];
A[s--] = temp;
}
for(int i = 1; i <= m; i++){
printf("%d ",A[i]);
}
printf("\n");
}
return 0;
}
测试数据:
输入
6
3 6 2 5 4 1
输出
3 6 4 1 2 5
2013 04 20
By ACReaper
分享到:
相关推荐
排列组合生成器,支持筛选,存储采用h2数据库,后台采用springboot框架
Unity UGUI动态生成N个Item自动排列
关键字生成工具 关键字 生成 组合工具 组合排列
7.2.2-生成可重集的排列.cpp ,描述了如何生成可重集排列。
生成排列 c语言 动态数组gcc下编译的
用Even算法实现生成排列 n为排列中个数
组合数学之排列组合生成算法,很好的学习组合排列算法的资料
7.2.1-生成1~n的排列.cpp ,描述了如何生成1~n排列.
用Johnson-Trotter算法实现生成排列(含代码实现)
excel VBA - 排列组合生成算法 - ,可快速生成指定项目的所有排列组合
大师Donald E. Knuth(汉名高德纳)的著作,计算机程序设计与艺术第四卷2册:生成所有元组和排列Generating All Tuples and Permutations(中英)
排列生成算法 字典序法 C语言源代码 排列生成算法的一种,采用交换和逆序的方法生成排列
组合数学之EVEN法生成排列 学习组合数学的朋友可以参考一下
Delphi写的NM排列组合,生成文本txt到指定目录,定义函数指针,生成N个数,输出N个数的全排列 ,OrderedCount为已经有输出顺序的数字。 比如 从Min=6开始选 (ToReachCount-NowNumCount)个数字(假设这个值为3)的话,也...
设置淘宝直通车的关键词组合、请将排列项输入软件下txt文档
用递归算法实现的简单排列生成器 其中K是开始排列点,m是数组的长度
清华大学选修组合数学的同学,不要抄袭此代码,会重复的!咱俩都没分!
作为关于组合查找的一部分,《计算机程序设计艺术:生成所有元组和排列(第4卷)(第2册)(双语版)》开始关于如何生成所有可能性的讨论。 关于算法分析的这多卷论著已经长期被公认为经典计算机科学的定义性描述。...
排列、组合的生成算法 排列、组合的生成算法
其思想是通过选择一对要交换的元素,在不干扰其他n-2元素的情况下,从先前的组合生成每个组合。 下面是生成n个给定数的所有组合的示例。 示例: 输入:1 2 3 输出:1 2 3 2 1 3 3 1 2 1 3 2 2 3 1 3 2 1...