递归拆分数组时仅左半部分被打印,求问题原因
问题分析与修复方案
核心错误原因
递归调用时传入的索引参数完全错误,子数组的索引范围应该基于自身的长度,而非原数组的索引值。
- 当你将切片后的
firstHalf传入递归时,它是一个独立的新数组,有效索引范围是0到len(firstHalf),但你传了原数组的left和mid,这会导致后续递归中left >= right,直接跳过拆分逻辑。 - 同理,
secondHalf递归时传入的mid+1和right是原数组的索引,和子数组自身的长度不匹配,递归条件left < right永远不成立,所以右半部分的拆分流程完全没执行。
修复后的代码
def mergeSort(array1, left, right): if left < right: mid = (left + right) // 2 firstHalf = array1[left:mid] secondHalf = array1[mid:right] print("firstHalf is : ") print(firstHalf) print("secondHalf is") print(secondHalf) # 递归子数组时,使用子数组自身的索引范围:0到自身长度 mergeSort(firstHalf, 0, len(firstHalf)) mergeSort(secondHalf, 0, len(secondHalf)) nums1 = [11, 25, 13, 44, 57, 69, 17, 8, 19, 120] low = 0 high = len(nums1) mergeSort(nums1, low, high)
额外优化点
原代码中secondHalf = array1[mid : right] + []的+ []是多余操作,切片array1[mid:right]本身就会生成新数组,直接去掉即可。
修复后效果
运行修复后的代码,会看到右半部分[69, 17, 8, 19, 120]的拆分过程也会被正常打印出来,完整展示整个递归拆分流程。
内容的提问来源于stack exchange,提问作者TechSelfLearner
相关产品推荐
相关产品推荐

