如何通过递归实现Quick Sort并返回完整排序后的列表?
修复你的快速排序函数,返回完整排序数组
我明白你的问题了——现在你的函数是通过print逐个输出排序后的元素,但你想要的是返回一个完整的排序好的数组,而不是直接打印。问题出在递归时没有把左右子数组的排序结果和基准值合并起来返回,而且基准情况(base case)的返回值也不符合数组类型的要求。
修改后的代码
import random def quick_sort_2(input_arr): if len(input_arr) <= 1: # 长度为0或1的数组本身就是有序的,直接返回原数组 return input_arr else: pivot = input_arr[0] left_arr = [] right_arr = [] # 遍历除基准值外的所有元素,分类到左右数组 for element in input_arr[1:]: if element < pivot: left_arr.append(element) else: right_arr.append(element) # 递归排序左右数组,再合并左数组+基准值+右数组,返回有序结果 return quick_sort_2(left_arr) + [pivot] + quick_sort_2(right_arr) # 测试调用 sorted_result = quick_sort_2([3, 5, 2, 6, 1, 7, 0]) print(sorted_result) # 现在可以得到完整的排序数组,也可以直接使用这个返回值
关键修改点解释
- 基准情况调整:原来的代码在数组长度为1时返回单个元素、长度为0时返回
None,现在统一返回原数组,保证每一层递归返回的都是数组类型,方便后续拼接。 - 递归结果合并:不再单独打印基准值,而是把左数组的排序结果、基准值(包装成单元素数组)、右数组的排序结果拼接起来,作为当前递归层的返回值。这样每一层都会输出一个有序子数组,最终上层就能得到完整的有序数组。
- 循环简化:把原来的
while循环改成for循环遍历除基准值外的元素,代码更简洁易读,避免手动维护索引变量i可能带来的错误。
原代码逐个输出的原因
原代码中递归调用quick_sort_2(left_arr)时,只是执行了函数内部的print操作,没有收集返回值;然后单独print(pivot),再递归处理右数组,整个过程是逐层打印元素,而没有把这些元素组合成数组返回。
现在修改后的函数,每一层都会把有序子数组拼接起来,最终返回完整的排序数组,你可以将其赋值给变量,后续按需使用或打印。
内容的提问来源于stack exchange,提问作者nuckingfut5
相关产品推荐
相关产品推荐

