Python 如何在快速排序算法中对负数排序?
我尝试使用快速排序算法对任意数字的随机列表进行排序,但不知道如何对负数进行排序,我应该处理代码的哪一部分 我不知道该怎么做,评论一下代码的变化会有很大帮助 预期成果:Python 如何在快速排序算法中对负数排序?,python,python-3.x,Python,Python 3.x,我尝试使用快速排序算法对任意数字的随机列表进行排序,但不知道如何对负数进行排序,我应该处理代码的哪一部分 我不知道该怎么做,评论一下代码的变化会有很大帮助 预期成果: >>> quickSort([3,5,-3,-1,1,2,4]) [-3, -1, 1, 2, 3, 4, 5] 实际结果: >>> quickSort([3,5,-3,-1,1,2,4]) [1, 2, -3, -1, 3, 4, 5] def快速排序(numList): n=len(nu
>>> quickSort([3,5,-3,-1,1,2,4])
[-3, -1, 1, 2, 3, 4, 5]
实际结果:
>>> quickSort([3,5,-3,-1,1,2,4])
[1, 2, -3, -1, 3, 4, 5]
def快速排序(numList):
n=len(numList)
如果n则意外结果不是由负数引起的,而是由快速排序算法中的几个错误引起的。我已经根据您的版本修复了它们,尽管它不是最好的实现版本。您可以比较修改后的代码并阅读注释以理解
我想指出的一个致命错误是,numList[:left]
将切片并生成一个新数组,当您对原始数组进行排序时,它不会影响原始数组。因此,您应该将数组
和左
,右
索引传递给快速排序
函数,而不是切片
def quickSort(numList, left, right):
# change check condition to left < right
# n = len(numList)
# if n <= 1:
# return numList
if left < right:
# copy left, right, it will used later
low, high = left, right
# it is better to abstract this block to a new function, like partition
# pick a pivot number
x = numList[left]
while left < right:
# you should use two-pointer to swap
while left < right and numList[right] >= x:
right -= 1
numList[left] = numList[right]
while left < right and numList[left] <= x:
left += 1
numList[right] = numList[left]
# if numList[left] <= x:
# left += 1
# else:
# numList[left], numList[right] = numList[right], numList[left]
# right -= 1
# assign back the pivot number
numList[left] = x
# numList[0], numList[left] = numList[left], numList[0]
# use origin arr and index, not slice
quickSort(numList, low, left-1)
quickSort(numList, left+1, high)
# quickSort(numList[:left])
# quickSort(numList[left + 1:])
return numList
希望这将对您有所帮助,如果您还有其他问题,请发表评论。:) 什么会让负数有什么不同?当你使用负数时,哪里出了问题?为什么你认为它不适用于负数?递归调用修改新列表,而不是原始列表。numList[:left]
使用指定的元素范围创建numList
的副本。与numList[left+1:][/code>相同。因此,对它们调用quicksort
,对提供的原始numList
没有影响。因此,您最终得到的结果是只围绕一个轴进行分区(在您的测试用例中,3)。这与负数无关,再多几个测试用例就可以很容易地显示负数。总的来说,我建议使用Occam的剃刀心态:很可能你的实现根本不起作用,而不是它只适用于负数以外的所有东西。不要急于下结论(然后在你的问题中提出这些未经证实的结论)。
def quickSort(numList, left, right):
# change check condition to left < right
# n = len(numList)
# if n <= 1:
# return numList
if left < right:
# copy left, right, it will used later
low, high = left, right
# it is better to abstract this block to a new function, like partition
# pick a pivot number
x = numList[left]
while left < right:
# you should use two-pointer to swap
while left < right and numList[right] >= x:
right -= 1
numList[left] = numList[right]
while left < right and numList[left] <= x:
left += 1
numList[right] = numList[left]
# if numList[left] <= x:
# left += 1
# else:
# numList[left], numList[right] = numList[right], numList[left]
# right -= 1
# assign back the pivot number
numList[left] = x
# numList[0], numList[left] = numList[left], numList[0]
# use origin arr and index, not slice
quickSort(numList, low, left-1)
quickSort(numList, left+1, high)
# quickSort(numList[:left])
# quickSort(numList[left + 1:])
return numList
arr = [3, 5, -3, -1, 1, 2, 4]
print(quickSort(arr, 0, len(arr)-1))
# [-3, -1, 1, 2, 3, 4, 5]