求助:我的Python快速排序程序无法完成完整排序的问题
快速排序部分排序的问题修复
嘿,我一眼就揪出你代码里的问题了——在quick_sort函数里,你递归调用的是pivot函数,而不是递归调用quick_sort本身!这就是数组只能部分排序的核心原因:你只完成了一次分区操作,却没对左右子数组继续递归排序。
错误点拆解
看你原代码里的这段:
def quick_sort(arr, low, high): if (low < high): pi = pivot(arr, low, high) pivot(arr, low, pi-1) # 这里应该调用quick_sort,不是pivot pivot(arr, pi+1, high) # 同样,这里也得是quick_sort
pivot函数的作用只是把基准元素放到正确位置、完成一次分区,但它不会对子数组进行排序。你必须递归调用quick_sort,才能让分区后的左右子数组也完成排序流程。
修正后的完整代码
def quick_sort(arr, low, high): if low < high: pi = pivot(arr, low, high) # 递归排序基准元素左侧的子数组 quick_sort(arr, low, pi - 1) # 递归排序基准元素右侧的子数组 quick_sort(arr, pi + 1, high) def pivot(arr, low, high): i = low - 1 pivot_val = arr[high] for j in range(low, high): if arr[j] <= pivot_val: i += 1 arr[i], arr[j] = arr[j], arr[i] # 将基准元素移到分区后的正确位置 arr[i + 1], arr[high] = arr[high], arr[i + 1] return i + 1 # 用你的测试数组验证 numbers = [-9859, -8554, -9846, -9558, -9153, -9483, -7946, -8255, -9743, -8330, -7632, -7513, -7125, 1756, -5176, -441, -3385, 896, -4748, 3811, 4285, -5883, -4342, 6275, 5753, 585, -2491, -243, -3590, -4377, 5986, -3393, -3727, 2976, -1532, -3924, 53, -2461, -5882, -1022, 2881, -3586, -3191, 6153, -4970, -5602, -5944, 5528, -3281, 1515, -680, -1975, -2472, -4371, -2574, -5248, -773, -271, -1967, 5079, 3040, -5871, 4825, 2810, -2301, 1371, 315, 2911, 2669, 2477, -3205, -2350, 2402, 5217, 6205, 2593, 4595, -4340, 6654, 7783, 9653, 8331, 8092, 6869, 7556, 9719, 8555, 9430, 8137, 9057, 8124, 7662, 6991, 6928, 7728, 7849, 7955, 7696, 7775] print("排序前:", numbers) quick_sort(numbers, 0, len(numbers)-1) print("排序后:", numbers)
修正说明
把quick_sort里的两次pivot调用换成quick_sort递归调用后,算法会对每个分区后的子数组重复执行「分区+递归排序」的操作,直到所有子数组的长度为1(此时low >= high,递归终止),这样就能得到完全排序的数组了。
内容的提问来源于stack exchange,提问作者SmashSquadd
相关产品推荐
相关产品推荐

