一摞烙饼的排序

本文探讨了如何通过程序实现烙饼排序的最佳策略,包括寻找最优方案的方法、使用动态规划或递归进行实现的步骤,以及如何通过穷举法找到最优解。同时,文章提出了一种改进策略,即在每次翻转时尝试将相邻的烙饼尽可能地换到一起,以加速排序过程。

假设有n块大小不一的烙饼 那最少要翻几次 才能达到最后大小有序的结果?


为了把最大的烙饼摆在最下面 先把最上面的烙饼和最大的烙饼之间的烙饼翻转 这样最大的烙饼就在最上面了 接着 把所有烙饼翻转 最大的烙饼就摆在了最下面


之后我们队上面n-1、n-2个饼重复这个过程

两次翻转就可以把最大的烙饼翻转到最下面 最多需要把上面的n-1个烙饼一次翻转两次 因此 最多需要2(n-1)次翻转就可以把所有烙饼排序好 !当倒数第2块小的饼翻转好 最小的一块就已经放在最上面了 因此是2(n-1)次

如何通过一个程序搜索到一个最优的方案?

首先 通过每次找出最大的烙饼进行翻转 这是一个可行的解决方法 

假如这堆烙饼中有好几个不同的部分相对有序 凭直觉 可以先把小一些的烙饼进行翻转让其有序 这样会比每次翻转最大的烙饼要快

还有其他的方案?比如 每次翻转时候 将两个本应该相邻的烙饼尽可能的换到一起 这样 当所有的烙饼都换到一起之后 实际上就是完成排序了


再次基础上 本能想到的方法就是穷举法 只要穷举出所有可能的交换方案就一定能够找到一个最优的方案


顺着这个思路 可以使用动态规划或者递归的方法进行实现 可以从不同的翻转策略开始 比如说使用先翻转最小的 然后递归把所有的可能全部翻转一遍 

这样最终可以找到一个解


但是 递归推出的条件?第一个推出的条件肯定是所有烙饼已经排好顺序。其它的?

最多翻转次数为2(n-1) 当翻转次数超过 2(n-1) 应当放弃这个翻转算法 这样就能减少翻转的次数

从另一方面 既然这是一个排序问题 应当利用排序的信息来进行处理 同样翻转过程中 可以看看当前的老兵数组的排序情况如何 然后利用这些信息帮助减少翻转次数的判断




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值