You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python快速排序中赋值交换与swap函数交换结果不同?

为什么两种交换方式的快速排序结果不同?

错误的快速排序代码

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

原因分析

核心错误出在基准值归位的步骤:

  • 错误代码中,pivot = arr[partion_index]是将数组对应位置的值复制到了pivot变量中,这个变量和数组本身没有关联。最后一步的pivot, arr[high] = arr[high], pivot只是交换了pivot变量的取值和arr[high]的取值,完全没有修改数组中原基准值所在的partion_index位置的元素,导致基准值没有被放到正确的分割位置,整个排序的分区逻辑彻底失效。
  • 正确代码中,swap(partion_index, high, arr)直接操作数组,将原基准值所在的partion_index位置元素和high位置元素交换,这才真正完成了基准值的归位,符合快速排序分区后基准值处于中间正确位置的要求。

另外需要说明:两段代码中中间交换low和high位置元素的逻辑是等价的——错误代码里的arr[low],arr[high]=arr[high],arr[low]和正确代码里的swap(low, high, arr)作用完全一致,问题只出在最后基准值的处理步骤上。

内容的提问来源于stack exchange,提问作者izz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:43:10