煎饼排序

煎饼排序是一种特殊的排序方法,通过翻转煎饼来实现。文章介绍了煎饼排序的基本思想,包括一般方法需要翻转2*n次,以及比尔·盖茨提出的最多翻(5n+5)/3次的优化方案。作者分享了两种自己的实现方法,一种是最常见的选择排序类似的操作,另一种是维持前序有序法,虽然未达到最优,但提供了理解问题的不同视角。
摘要由CSDN通过智能技术生成

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

这个问题我也是偶然看到知乎上讨论比尔盖茨的话题中了解到的。说他找到了更好的方法。一般来说煎饼排序最多要翻 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][::
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值