【问题标题】:Quicksorting a given list in Python, while printing each step在 Python 中快速排序给定列表,同时打印每个步骤
【发布时间】:2019-10-10 12:00:35
【问题描述】:

所以,我的老师,一个过于痴迷于为每项家庭作业添加细节的人,给了我一个我想不出办法去做的任务。

这是关于 Python 中的快速排序,他希望我们构建一个函数,在打印出每个步骤的同时快速排序列表。到目前为止,我一直在使用 List Comprehension 方法进行快速排序,但我一直无法弄清楚我的打印语句的放置位置和方式。

这是我目前使用的代码:

def quick_sort(lst):
    if lst == []:   return []
    pivot = lst[0]
    left = [x for x in lst[1:] if x < pivot]
    right = [x for x in lst[1:] if x > pivot]
    return quick_sort(left) + [pivot] + quick_sort(right)

我尝试打印出python quick_sort(left) + [pivot] + quick_sort(right) 在返回它之前,但它打印的输出与我想要的不匹配。考虑一下,这是有道理的,因为 List Comprehension 方法试图通过将列表分成几部分来对列表进行排序,并且我的函数在每个较小的分区上重新调用自己,直到其中没有任何元素。

我希望,当我输入一个列表时,例如[5, 1, 4, 3, 2],程序至少应该以这样的方式打印出步骤(考虑我将第一个元素作为枢轴):

>>> Enter the list: 5, 1, 4, 3, 2

[1, 4, 3, 2, 5] 5 是枢轴,左侧较小的值,现在应该对[1, 4, 3, 2] 进行排序

[1, 4, 3, 2, 5] 1 是枢轴,右侧较大的值,现在应该对[4, 3, 2] 进行排序

[1, 3, 2, 4, 5] 4 是枢轴,左侧较小的值,现在应该对[3, 2] 进行排序

[1, 2, 3, 4, 5] 3 是枢轴,左侧较小的值,现在应该对[2] 进行排序

[1, 2, 3, 4, 5] 2 是枢轴,没有剩余值,返回[],并退出递归

也许这可以通过定义另一个函数来完成,该函数将存储一个额外的列表并在每次quick_sort() 中发生递归时更新它,但我还没有想到这一点。

【问题讨论】:

  • 如果选择一个作为基准,您的快速排序将丢弃重复项。
  • 无论如何,你能不能在递归调用之前打印left + [pivot] + right之类的东西?
  • @Blorgbeard 问题在于 OP 正在执行分而治之的快速排序,而不是就地快速排序。
  • 我尝试打印left + [pivot] + right,但由于每次递归调用都会将列表划分为更小的分区,因此在[4, 3, 2] 之类的分区上调用quick_sort() 将打印出[3, 2, 4] 而没有列表的其余部分.这就是我可能声明一个新函数的意思,该函数将存储一个额外的列表并使用quick_sort() 返回的内容不断更新它。
  • 是的;那是间接递归,但仍然是递归。然而,这听起来很尴尬。坦率地说,我建议您放弃更常见的传递列表索引的实现,以实现此传递的低限和高限。

标签: python quicksort


【解决方案1】:

您的讲师做出了一个无效的假设:您将快速排序实现为就地排序,而不是您使用的分治法。就地假设确实有优点,因为它执行的数据移动要少得多:您的例程在每次调用时都会创建三个新列表,而不仅仅是根据需要交换列表元素。然而,这里有部分尝试安抚你的导师,强调你的方法:

def quick_sort(lst):
    if lst == []:   return []
    pivot = lst[0]
    left = [x for x in lst[1:] if x < pivot]
    right = [x for x in lst[1:] if x > pivot]
    print(lst, pivot, "is pivot", left, "and", right, "should be sorted")
    new_list = quick_sort(left) + [pivot] + quick_sort(right)
    print("NEW", new_list)
    return new_list

quick_sort([4, 1, 5, 3, 2])

【讨论】:

    猜你喜欢
    • 2013-08-03
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 2021-01-11
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    相关资源
    最近更新 更多