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

随机快速排序(randomized quick sort)基准分支偶发失效问题

问题原因与解决方案

你遇到的偶发无序问题,核心是两个逻辑错误:

1. 子数组长度判断错误

你混淆了索引差值和实际元素个数:

  • e - s == 1 对应的是2个元素的子数组(索引s和e)
  • e - s == 2 对应的是3个元素的子数组(索引s、s+1、e)

当处理3个元素的子数组时,partition只能将pivot放到正确位置,但pivot左右的子数组(比如右侧的两个逆序元素)并不会自动有序。你直接return跳过了递归处理,这部分无序元素就会留在最终数组里,导致偶发错误。

2. 短数组处理逻辑错误

即便对于2个元素的子数组,直接调用partition虽然多数情况能排好序,但依赖固定选第一个元素当pivot的逻辑;而3个元素的场景下,partition完成后必然存在未处理的子数组,不递归就会留下无序隐患。

修复方案

把原来的短数组判断逻辑替换成对长度<=2的子数组直接做简单交换排序,避免依赖partition且跳过递归的问题:

import random

def quickSort(arr,s,e):
    if s >= e: return 
    # 处理长度为1或2的子数组
    if e - s <= 1:
        if arr[s] > arr[e]:
            arr[s], arr[e] = arr[e], arr[s]
        return    
    x = randPartition (arr,s,e)
    quickSort(arr,s,x-1)
    quickSort(arr,x+1,e)
        
def partition(arr,s,e):
    pivot = arr[s]
    x = s
    for i in range (s+1,e+1):
        if arr[i] < pivot :
            x+=1
            arr[x],arr[i]=arr[i],arr[x]
    arr[s],arr[x] = arr[x],arr[s]
    return x 

def randPartition(arr,s,e):
    x = random.randint(s,e)
    arr[x],arr[s] = arr[s],arr[x]
    return partition(arr,s,e)

arr = [1,5,0,3,-15,12,96,99,1500,-1500,66,120]
quickSort(arr,0,len(arr)-1)
print(arr)

这样修改后,无论随机选pivot的结果如何,短数组都会被正确排序,不会再出现偶发无序的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:44:59