这是快速排序的代码,其中我使用赋值来交换值。
def partion(arr,low,high):
partion_index=low
pivot=arr[partion_index]
while (low < high):
while low < len(arr) and (arr[low]<=pivot):
low+=1
while (arr[high]>=pivot):
high-=1
if (low < high):
arr[low],arr[high]=arr[high],arr[low]
pivot,arr[high]=arr[high],pivot
return high
def quickSort(arr,low,high):
if(low <high):
p=partion(arr,low,high)
quickSort(arr,low,p-1)
quickSort(arr,p+1,high)
这会产生错误的结果。当我尝试使用交换功能来完成相同的工作时,它起作用了。
def swap(a, b, arr):
if a!=b:
tmp = arr[a]
arr[a] = arr[b]
arr[b] = tmp
def partion(arr,low,high):
partion_index=low
pivot=arr[partion_index]
while (low < high):
while low < len(arr) and (arr[low]<=pivot):
low+=1
while (arr[high]>=pivot):
high-=1
if (low < high):
swap(low, high, arr)
swap(partion_index, high, arr)
return high
为什么会这样?
你遇到的问题与使用赋值交换与使用函数交换无关。这两种方法在 Python 中都可以用来交换列表中的元素。真正的问题在于分区逻辑中的 枢轴元素的最终位置 的处理方式。
让我们来分析一下你的代码出了什么问题,以及如何解决它。
问题所在
你的原始
partition
函数中的错误在于这一行:
pivot,arr[high]=arr[high],pivot
在分割操作结束时,
high
指向了枢轴元素应该在的正确位置。然而,你执行的赋值实际上导致了两个问题:
-
枢轴值的丢失:
你用
arr[high]
的值覆盖了pivot
的原始值。虽然你打算将arr[high]
放置在枢轴位置,但这个操作丢失了原始的枢轴值。 -
不一致的交换:
在这种情况下,你只交换了
pivot
和arr[high]
,这与你之前在循环中使用arr[low], arr[high] = arr[high], arr[low]
进行的交换不一致。这种不一致可能会导致错误的排序结果。
解决方案
要解决此问题,应该
直接将枢轴元素放置在
high
指向的正确位置
。由于
partition_index
(或
low
,因为它引用相同的位置)保存着枢轴元素的原始索引,因此可以直接进行交换:
def partion(arr, low, high):
partion_index = low
pivot = arr[partion_index]
while low < high:
while low < len(arr) and arr[low] <= pivot:
low += 1
while arr[high] >= pivot:
high -= 1
if low < high:
arr[low], arr[high] = arr[high], arr[low]
# 将枢轴放置在正确的位置
arr[partion_index], arr[high] = arr[high], arr[partion_index]
return high
通过这种修改,无需使用单独的
swap
函数,并且可以确保将枢轴元素正确放置在已排序数组中的最终位置。
使用或不使用
swap
函数
只要在
partition
函数中更正了枢轴放置逻辑,使用赋值交换或使用单独的
swap
函数都不会影响快速排序的正确性。两种方法都实现了相同的目标,即交换列表中的元素。选择哪种方法主要取决于个人的编码风格和偏好。