【问题标题】:Pancake Sort in python, and empty max() error messagepython中的煎饼排序,并为空max()错误消息
【发布时间】:2021-03-05 13:11:47
【问题描述】:

pancake_sort 按降序对一些数字进行排序(将最大的数字翻转到数组的顶部(末尾)然后返回底部),然后打印它执行该操作的索引 (+1)。这意味着数组[4,3,2,1,5]将从索引0翻转,使其变为[5,1,2,3,4]并打印1,然后将从索引1翻转并变为[5,4,3,2,1],并将打印2。一旦完成所有它的翻转,然后应该打印 0。我尝试将数组的不同部分添加在一起(翻转的部分和保持相同的部分),但它不起作用。我得到这个输出和错误信息:

1 
1 Traceback (most recent call last):
  File "/Users/khadijah/Documents/pypan.py", line 32, in <module>
    pancake_sort(arr)
  File "/Users/khadijah/Documents/pypan.py", line 19, in pancake_sort
    mi = arr.index(max(arr[i:arr_len]))
ValueError: max() arg is an empty sequence

我知道它与mi 值中的i 有关,但我认为我需要它,以便它只检查iarr_len 之间的数字。使用arr_len-1 也不起作用。你觉得我做错了什么?

这是我的代码:

def pancake_sort(arr):
    arr_len=len(arr)
    i=0
    for i in range(0,arr_len-1):
        mi = arr.index(max(arr[i:arr_len]))
        arr = arr[0:mi-1]+arr[mi::-1]
        print()
        if mi == arr_len-1:
            print("1", end = " ")
        else: print(mi+1, end = " ")
        if i==0:
            arr=arr[::-1]
        else:
            arr = arr[0:i-1]+arr[i::-1]
    return arr

arr = [4,3,2,1,5]
pancake_sort(arr)

【问题讨论】:

    标签: python arrays sorting


    【解决方案1】:

    您可以使用带 reversed() 的下标赋值来“翻转”煎饼:

    def flipSort(A):
        for i in range(len(A)-1):
            p = A[i:].index(max(A[i:])) + i # index of max (to end)
            if i==p: continue               # nothing to flip, skip
            A[i:p+1]=reversed(A[i:p+1])     # <-- here is how to flip a subrange
            print(i+1,end=" ")              # print index (why one-based?)
        print("0")
    

    输出:

    A = [4,3,2,1,5]
    flipSort(A)
    1 2 0
    print(A)
    [5, 4, 3, 2, 1]
    

    【讨论】:

    • 这几乎完全有效!对于较小的数组,它似乎可以工作,但我的一些数组只是大于 100 个元素。它最终给了我 1 2 3 4 5 6 7 8....一直到 100 0。你认为这是为什么?
    • 这取决于数组的内容。如果数组是随机的,很少有递增递减的条纹,那么您将更有可能在每个索引处(或最多)进行交换。数组越大,低索引翻转的概率就越高。这就是为什么在现实世界中不使用这种排序算法的原因。
    • 例如,如果您的数组有不同的 500 个随机元素,则在第一个索引上,您有 499/500 次需要翻转的机会,在第二个索引 498/499 上,在第三个索引 497/ 498, ... 2/3, 1/2。简而言之,您有大约 80% 的机会一直到最后一个索引
    • 这是有道理的!谢谢你的帮助:)
    【解决方案2】:

    你可以使用是:

    def pancake_sort(arr):
        cur = len(arr)
        while cur > 1:
            # Find the maximum number in arr
            mi = arr.index(max(arr[0:cur]))
            # Reverse from 0 to mi
            arr = arr[mi::-1] + arr[mi + 1 : len(arr)]
            # Reverse whole list
            arr = arr[cur - 1 :: -1] + arr[cur : len(arr)]
            cur -= 1
            print(cur)
        return arr
    
    print(pancake_sort([4,3,2,1,5]))
    

    【讨论】:

    • 不,不幸的是,因为它是按升序排列的,并且输出的翻转位置错误。不过谢谢!
    猜你喜欢
    • 2021-03-24
    • 1970-01-01
    • 2018-06-22
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2016-03-03
    • 1970-01-01
    相关资源
    最近更新 更多