Python快速排序代码触发int与NoneType不支持'>='比较报错如何解决
报错触发原因
- 核心问题出在
partition函数的缩进错误,导致函数在部分执行路径下没有显式返回值,默认返回None:- 当待处理的子数组长度≤2时,
for j in range(left + 1, right)生成的遍历序列为空,for循环全程不执行,函数没有走到return语句,返回None - 即使进入for循环,你把交换 pivot 元素、返回 pivot 最终位置的代码写在了for循环内部,第一次循环迭代就会直接返回,既不符合快排分区的逻辑,也存在循环未执行就返回
None的问题
- 当待处理的子数组长度≤2时,
- 当
partition返回None时,赋值给变量j,后续递归调用quickSort(arr, left, j)时,传入的第三个参数是None,进入下一层递归判断if left >= right时,就会出现整数和None比较的类型错误,也就是你遇到的报错。
代码修改方案
你只需要调整partition函数的缩进,把交换pivot、返回pivot位置的代码移到for循环外部即可,同时可以删除快排函数里无效的自我交换代码,修复后的完整代码如下:
def quickSort(arr, left, right): # 边界条件:子数组长度为0或1时直接返回 if left >= right: return j = partition(arr, left, right) # 递归排序左右分区 quickSort(arr, left, j) quickSort(arr, j + 1, right) def partition(arr, left, right): p = arr[left] i = left + 1 for j in range(left + 1, right): if arr[j] < p: # 交换元素 arr[i], arr[j] = arr[j], arr[i] i += 1 # 遍历完所有元素后,将pivot交换到正确的分界位置 arr[left], arr[i-1] = arr[i-1], arr[left] # 返回pivot的最终位置 return i - 1
额外优化建议
- 你当前读取文件的逻辑没有关闭文件句柄,建议改为
with open('test1.txt') as textFile1:的写法,执行完后会自动关闭文件,避免资源泄漏 - 你当前选择最左元素作为pivot的实现,在处理已经有序的数组时时间复杂度会退化到O(n²),如果需要处理有序数据集,可以优化为随机选择pivot的实现。
内容的提问来源于stack exchange,提问作者User12345
相关产品推荐
相关产品推荐

