煎饼排序

在这里插入图片描述
煎饼排序指的是将大小不同的一摞煎饼(一个煎饼放在另一个煎饼上堆起来),按大小排序的数学问题,其中的操作是,只能用煎饼铲子从任意位置插入,铲起上方全部煎饼并翻面。学术化一点,就是只能把插入位置之前的数组翻转的排序方法–“前序翻转排序”。

这个问题我也是偶然看到知乎上讨论比尔盖茨的话题中了解到的。说他找到了更好的方法。一般来说煎饼排序最多要翻 2*n 次,但是他找到了最多翻(5n+5)/3 次的方法。我自己思考了一下这个问题,最后也找到两个种方法。

第一种:(也是普遍的做法,大家都能想得到)
因为只能翻转上面的,有序的放下面的就不会被干扰。我们可以一个个的找最大值,翻到前面,再翻到区间最下面,所以一次操作要翻2次。要操作n次,所以就是2*n次翻面。有点像选择排序。。。

每一操作的步骤:
第一次,我们从区间中找到最大值,翻到前面。
第二次,把这个最大值翻到下面。

比如 [1, 3, 4, 2, 0],
前5个数字区间,最大值 4,先把他翻到上面 [4, 3, 1, 2, 0]
然后翻转前5个数字区间 [0, 2, 1, 3, 4], 这样4就被放到底部啦。

接着,前4个数字区间,最大值 3,因为已经在区间最底部了,就不用操作啦

接着,前3个数字区间,最大值 2, 翻出来,[2, 0, 1, 3, 4],
再翻转区间,[1, 0, 2, 3, 4]

最后,前2个数字区间,最大值1,已经在头部了,不用翻,
再翻转区间, [0, 1, 2, 3, 4]

完成

python代码:

import random


def pancake_sort(arr):
    l = len(arr)
    for i in range(len(arr)):
        maxidx = arr.index(max(arr[:l - i]))
        if maxidx != l - i:  # 如果已经在正确位置,就不用操作了
            if maxidx != 0:  # 如果不在头部,就要翻到头部
                arr = arr[:maxidx + 1][::
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值