离散数学的一个求下一个较大排列的算法
问题引入
Example: Permutation 23415 of set {1, 2, 3, 4, 5} precedes the per-
mutation 23514. Similarly, permutation 41532 precedes 52143.
Question: What is the next permutation in lexicographic order after
32541?
伪代码:
- 输入n个数,以-1结束,然后会输出下一个大的排列
1.首先让$aj$等于倒数第二个位置,然后和$a{j+1}$ 去相比。如果$aj>a{j+1}$ 那么j—, 一直比到 $aj<a{j+1}$ 为止
2.让$ak$ 等于倒数第一个位置,然后和当前的 $a_j$ 去比,如果$a_j>a{k}$ 那么k—, 一直比到 $a_j<a_k$ 为止
3.让$a_j$ 与 $a_k$ 交换
4.让现在$a_j$ 位置后面的数字按照从小到大排列。既可以是排序,也可以是头尾两两交换。
1 | /* |
1 |
|
同理,我们也可以得到下一个较小排列的算法:
1.首先让$aj$等于倒数第二个位置,然后和$a{j+1}$ 去相比。如果$aj<a{j+1}$ 那么j—, 一直比到 $aj>a{j+1}$ 为止
2.让$ak$ 等于倒数第一个位置,然后和当前的 $a_j$ 去比,如果$a_j<a{k}$ 那么k—, 一直比到 $a_j>a_k$ 为止
3.让$a_j$ 与 $a_k$ 交换
4.让现在$a_j$ 位置后面的数字按照从大到小排列。既可以是排序,也可以是头尾两两交换。