字典序法——钟声中的全排列

编写算法用计算机解决钟鸣问题

已知有12口编钟,随机敲响,那么有多少种全排列?

我们发现,可以把较短的排列加入一个最高位进行挪位后生成长一个元素的排列。

于是我们联想到递归思想。

那么如何把用计算机进行全排列呢?

这里采用字典序。

 

 

 

这里我们可以发现,按照字典序法,最后一个排列应该是321,从右向左进行扫描,应当是左侧数字严格大于右侧。

 

1.

 

 2.这里1比3小,因此应当让比后缀(下降点后面的序列)里1大的最小的数字,即2与1进行交换,此时后缀是31,不是最小后缀,所以31交换换成为213,如此循环往复,即可以得到全部的排列。

 

sjt算法

定义一个新的概念:可移动数

 

 1.给排列中所有数字指向左方。

2.最大的可移动数依次与左侧相邻数不断进行交换直到端点,同时生成一个个排列。

3.这时最大的数不能动了,此时最大的可移动数与指向方向的邻位数进行交换,随后所有可移动数的方向指向变反。

4.此时最大的可移动数依次与指向方向的数换位...

......循环往复即可得到所有序列。

函数实现及调用方式

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值