【发布时间】: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()返回的内容不断更新它。 -
是的;那是间接递归,但仍然是递归。然而,这听起来很尴尬。坦率地说,我建议您放弃更常见的传递列表索引的实现,以实现此传递的低限和高限。