【发布时间】: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