【问题标题】:I am not getting output from the quick sort我没有从快速排序中获得输出
【发布时间】:2021-12-10 16:23:57
【问题描述】:

我没有从下面的快速排序代码中得到输出:

def quick_sort(sequence):
    length = len(sequence)
    if length<=1:
        return sequence
    else:
        pivot = sequence.pop()
        item_greater = []
        item_lower = []
        for item in sequence:
            if item> pivot:
                item_greater.append(item)

            else:
                item_lower.append(item)
                print( quick_sort(item_lower) + [pivot]  + quick_sort(item_greater))

测试快速排序算法:

print(quick_sort([91,45,78,124,174,32,75,69,43,15,2,45,19,66]))

【问题讨论】:

标签: python algorithm quicksort


【解决方案1】:

返回你的值而不是打印出来:

def quick_sort(sequence):
    length = len(sequence)
    if length<=1:
        return sequence
    else: pivot = sequence.pop()
    item_greter = []
    item_lower = []
    for item in sequence:
        if item > pivot: item_greter.append(item)

        else:
            item_lower.append(item)
            return quick_sort(item_lower) + [pivot]  + quick_sort(item_greter)
            
print(quick_sort([91,45,78,124,174,32,75,69,43,15,2,45,19,66]))

【讨论】:

  • 即使这样仍然行不通 - 他一开始就缺少一大堆代码。
  • 也很遗憾,它的缩进模式比使用的 Asker 更差。
【解决方案2】:

这些是主要问题:

  1. 您的函数不会返回结果,因此您将从递归调用中返回None,然后+ [pivot] 操作将引发错误。

  2. 与上一点有关:当递归结果回来时,它不应该被打印。仅当最终结果准备好时才应进行打印,即这是原始调用者的工作(在主代码中)。

  3. 不应在填充两个分区的循环中进行递归调用。它应该在之后那个循环

没问题,但是“greter”的拼写是“greater”

此外,您可以跳过第一个else,因为if 块将以return 结尾。

更正:

def quick_sort(sequence):
    length = len(sequence)
    if length <= 1:
        return sequence
    pivot = sequence.pop()
    item_greater = []
    item_lower = []
    for item in sequence:
        if item > pivot: 
            item_greater.append(item)
        else:
            item_lower.append(item)
    return quick_sort(item_lower) + [pivot]  + quick_sort(item_greater)


print(quick_sort([91,45,78,124,174,32,75,69,43,15,2,45,19,66]))

最后的评论

  1. 这个函数破坏输入列表并不好。如果调用者有对该列表的引用并在调用后检查它,它将缺少一个元素。这是由于在其上执行的第一个pop:

    lst = [91,45,78,124,174,32,75,69,43,15,2,45,19,66]
    print(quick_sort(lst))
    print(lst)  # misses the last element and is not sorted
    
  2. 快速排序旨在成为一种就地排序算法,因此您不需要创建新列表(item_greater 和item_greater)。相反,这些分区应该由输入列表中的交换值形成。在这样的实现中应该没有[](新的空列表)或+(列表连接)。

就地快速排序算法的正确版本很容易获得。可能有许多变体,具体取决于枢轴选择。在这个网站上也有几个关于这个话题的问答。例如:

【讨论】:

    猜你喜欢
    • 2015-03-13
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2017-11-03
    • 2018-04-13
    相关资源
    最近更新 更多