【问题标题】:Quick sort append to list with recursion?快速排序附加到递归列表?
【发布时间】:2018-05-29 14:56:53
【问题描述】:

让这个快速排序函数返回一个实际列表而不是逐个返回项目时,我遇到了一些困难。排序逻辑工作正常,但没有返回数组。有没有办法添加一个持久列表,将项目附加到每个循环?

import random


def quick_sort_2(input_arr):

    if len(input_arr) == 1:
        print(input_arr[0])
        return input_arr[0]
    elif len(input_arr) == 0:
        return
    else:
        pivot = input_arr[0]
        i = 0
        left_arr = []
        right_arr = []
        while i < len(input_arr):
            if input_arr[i] < pivot:
                left_arr.append(input_arr[i])
                i += 1
            elif input_arr[i] > pivot:
                right_arr.append(input_arr[i])
                i += 1
            else:
                i += 1
        quick_sort_2(left_arr)
        print(pivot)
        quick_sort_2(right_arr)


quick_sort_2([3, 5, 2, 6, 1, 7, 0])

快速说明是我在这里使用 print 但实际上我想以某种方式使用 return。

【问题讨论】:

  • 您的函数只返回None,或者在输入列表为空的情况下显式返回,或者在其他情况下隐式返回。您可能想要添加适当的返回语句并列出连接。此外,您可能希望将while 循环替换为for 循环以获得更好的易读性和结构。最后,准确地说,Python 只有lists,而不是arrays。
  • 如果列表仅包含 1 项,我将返回语句添加到案例中......我将如何在这里使用列表连接?每次我递归调用函数时它不会覆盖列表吗?
  • 最后你想返回一个(排序的)list,所以每个返回语句都必须返回一个list,因为你会递归调用它并聚合返回的值。然后,您最外层的函数调用(因此第一个函数调用)将返回排序列表。您可以使用list.extend、改变调用实例或二进制+ 运算符轻松连接两个列表,返回其参数连接的新列表。在此处查看斐波那契数列的递归是如何完成的:geeksforgeeks.org/program-for-nth-fibonacci-number
  • 我将顶部的 if 语句修改为现在的 return input_arr,因此当只有一项时,它应该返回实际列表。它仍然没有输出列表,现在它不包括排序列表的第一项和最后一项(本例中为 0 和 7)。感谢您的帮助,您还有其他建议吗?
  • 我可以为您提供解决方案,但其中的乐趣在哪里? :-) 考虑一下您想要返回的内容,以防您将元素排序到枢轴元素的左侧和右侧。理想情况下,只需将算法写在一张纸上,以获得几个随机数的列表。递归将在枢轴元素的左侧和右侧构建“树”,调用相同的函数,因此也会构建“树”,直到您到达空列表或单元素列表。

标签: python recursion quicksort


【解决方案1】:

解决方案是在函数的每个分支中实际返回一个结果列表。如果没有要排序的内容,它可能是空列表。否则,它是所有小于枢轴元素的元素的排序列表,加上枢轴元素,以及大于或等于(或不小于)枢轴元素的所有元素的排序列表。

def quick_sort_2(items):
    items = iter(items)
    try:
        pivot = next(items)
    except StopIteration:
        return []
    else:
        left_items = []
        right_items = []
        for item in items:
            (left_items if item < pivot else right_items).append(item)
        return quick_sort_2(left_items) + [pivot] + quick_sort_2(right_items)

【讨论】:

    猜你喜欢
    • 2022-12-16
    • 1970-01-01
    • 2020-08-14
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    相关资源
    最近更新 更多