一个经典的全排列算法
2008-04-14 19:42
330 查看
设想有 n 个数字, 先取第一个数字. 再取第二个数字, 第二个数可以放在第一个数的左或右面, 就是有 0, 1 两个选择. 再取第三个数, 放到前面选好的两个数字中, 可以放在最左, 中间, 最右, 就是有 0, 1, 2 三个选择. 嗯, 很自然吗. 忽然你想到了二进位, 八进位那些数系转换关系。可以设计这样一个数, ...xyz, 其中个位数 z 是二进位的, 也就是放第二个数的两个位置; 十位数 y 是三进位的, 代表放第三个数字的三个位子, 然后百位数是四进位, 千位数是五进位的, 依以类推." 没错, 这样设计的话, 如果 0 表示放於最左面的话, 则 "2021" 这个数就代表了排列五个元素 (abcde), 取一个 a, 然后第二个 b 放在 a 的右面成 ab, 取 c 放到最右面成为 abc, 取 d 放到最左面成 dabc; 最后 e 放到中间去成为 daebc. 至於 "2021" 这个特别的设计的数可以用2*5+ 0*4 + 2*3 + 1*2 这样的计算来映对到自然数的数列上去。
如求 4 个数的 4! = 24 个排列, 第 18 个排列可以这样求得, 18 除 2, 余数是 0, 所以第二个数放在第一个数的左面; 然后商 9 再除 3, 余数 0, 所以第三个数於在头两个数的最左; 最后 3 除以 4, 余数是 3, 因此第四个数要放在前三个数的第 4 个空位, 也就是最右面。
如求 4 个数的 4! = 24 个排列, 第 18 个排列可以这样求得, 18 除 2, 余数是 0, 所以第二个数放在第一个数的左面; 然后商 9 再除 3, 余数 0, 所以第三个数於在头两个数的最左; 最后 3 除以 4, 余数是 3, 因此第四个数要放在前三个数的第 4 个空位, 也就是最右面。
相关文章推荐
- 【有趣的面试算法题】之六 把正数集中的数排列成一个最小的数,最高位升序排列就好
- java经典算法_008求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字
- java经典算法_023给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
- java经典算法_027取一个整数a从右端开始的4~7位。
- [经典算法] 排列组合-全排序
- 搜狐笔试题:给定一个实数数组,按序排列(从小到大),从数组从找出若干个数,使得这若干个数的和与M最为接近,描述一个算法,并给出算法的复杂度。
- 算法竞赛入门经典:习题2-6排列
- 2015阿里秋招其中一个算法题(经典)
- LCA问题的在线算法(很经典的一个算法)
- 经典算法面试题目-判断一个字符串中的字符是否唯一(1.1)
- [经典算法]洗扑克牌(乱数排列)
- 一个消除重复排列的所有输入字符串的排列算法
- 白话经典算法系列之中的一个 冒泡排序的三种实现
- 一个php实现的生成排列的算法
- 如何实现一个不规则排列的图片布局算法
- 算法竞赛入门经典 习题2-10排列数字1~9形成1:2:3的等比数列
- 经典算法一个数二进制中1的个数
- c语言经典算法——查找一个整数数组中第二大数
- 算法竞赛入门经典 习题2-10 排列(permutation)
- 假设有两个按元素值递增有序排列的线性表A和B,均以单链表作存储结构,请编写算法将A表和B表归并为一个按元素值递减 有序(即非递增有序,允许表中含有值相同的元素)排列的线性表C,并要求利用原装(即A表和