【问题标题】:Having issues implementing recursion in my attempt at a quick sort algorithm in Python在我尝试使用 Python 中的快速排序算法时遇到递归问题
【发布时间】:2019-06-22 00:46:14
【问题描述】:

我正在尝试在 Python 中编写我自己的快速排序算法,而无需查看它是如何专业完成的(我将通过这种方式了解更多信息)。如果我打算如何实现这种快速排序的想法对您来说似乎很愚蠢,(我知道它可能会)请不要给我一个完全不同的方法,除非我的方法永远不会成功或至少不会成功没有荒谬的措施,请帮助我用我想要的方法找到解决方案:)

目前我定义了一个函数“pivot”,它将获取输入列表并输出三个列表,一个小于枢轴的数字列表(在这种情况下,每次都选择为列表中的第一个数字),一个等于枢轴的数字列表和大于枢轴的数字列表。

我的下一步是定义一个函数“q_sort”。首先,此函数创建一个名为“finalList”的列表,并用 0 填充它,使其与被排序的列表长度相同。接下来,它旋转列表并将等于枢轴的数字添加到 finalList 已经是它们的正确位置(因为有 0 表示小于它的项目数,而 0 再次作为占位符代替大于枢轴的项目)

这一切都很好。

不能正常工作的是下一步。我在下面的一些考虑不周的伪代码中写了我接下来想要发生的事情:

numList = [3, 5, 3, 1, 12, 65, 2, 11, 32]

def pivot(aList):
    biggerNum =[]
    smallerNum = []
    equalNum = [aList[0]]
    for x in range(1, len(aList)):
        if aList[0]<aList[x]:
            biggerNum.append(aList[x])
        elif aList[0]>aList[x]:
            smallerNum.append(aList[x])
        elif aList[0] == aList[x]:
            equalNum.append(aList[x])
    pivoted = [smallerNum, equalNum, biggerNum]
    return pivoted

def q_sort(aList):
    finalList = []
    for x in range(len(aList)):
        finalList.append(0)
    pivot(aList)
    for i in range(len(pivot(aList)[1])):
        finalList[len(pivot(aList)[0])+i] = pivot(aList)[1][i]

伪代码:

    #if len(smallerNum) != 0:
        #q_sort(smallerNum) <--- I want this to add it's pivot to finalList
    #if len(biggerNum) != 0:
        #q_sort(biggerNum) <--- Again I want this to add it's pivot to finalList
#return finalList <--- Now after all the recursion every number has been pivoted and added

我打算发生的是,如果小于枢轴的数字列表实际上有任何项目,那么它将 q_sort 这个列表。这意味着它将找到一个新的枢轴并将其值添加到 finalList 中的正确位置。我想象它的工作方式是,一旦“numList”中的每个数字都放在正确的位置,该函数才会到达“return finalList”。由于在 q_sort 中包含 q_sort 的递归性质意味着在旋转“smallerNum”(并将枢轴添加到 finalList)之后,它将有另一个列表进行旋转。

【问题讨论】:

  • 递归调用应该发送开始/结束索引。这个植入不行!
  • 是否有类似的实现,您可能会建议我走向?具有相同理论但使用实际有效的方法?

标签: python list sorting recursion quicksort


【解决方案1】:

问题是您每次通话都要重新开始:使用整个列表,从两端开始工作。您需要在列表的每个分区上重复:枢轴下方的部分,然后是枢轴上方的部分。这通常通过传递子列表的端点来完成,例如...

def q_sort(aList, low, high):
    if low >= high:
        return

    # find pivot position, "pivot"
    ...
    # arrange list on either side of pivot
    ...
    # recur on each part of list. 
    q_sort(alist, low_index, pivot-1)
    q_sort(alist, pivot+1, high_index)

这样的大纲足以让你动起来吗?

如果没有,请尝试在“Python 快速排序”上进行浏览器搜索,您会发现很多帮助,比我们在此介绍的更全面。

【讨论】:

  • 我想我可能有点超出我的深度,我可能天真地认为我可以编写自己的快速排序。不过还是谢谢你
  • 好的,然后……从更简单的排序开始,然后是更简单的递归排序(例如冒泡排序的递归版本),然后尝试固有的递归排序,例如归并排序。编写自己的版本没有错;在这一点上,你只需要做更多的工作来确保你遵循给定的算法。另外,尝试插入一些简单的print 语句来跟踪数据和流。请参阅这个可爱的 debug 博客寻求帮助。
猜你喜欢
  • 2021-12-31
  • 2018-12-01
  • 2020-04-18
  • 2017-01-14
  • 1970-01-01
  • 2018-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多