归并排序中子数组的分配与存储问题问询
关于归并排序中子数组存储的解决方案
嗨,兄弟!我完全懂你这种困惑——归并排序的递归逻辑看似清晰,但子数组的存储和作用域问题确实容易卡壳。咱们一步步拆解:
核心思路:避免作用域溢出的两种常用方式
1. 在递归函数内创建临时子数组,合并后返回结果
这种方式最直接,每次递归拆分后,对左右子数组分别排序,然后在当前函数栈内创建临时数组来合并这两个有序子数组,最后返回这个合并好的数组。这样就不用担心子数组超出作用域,因为每个递归层级的结果都会被上层函数接收。
举个伪代码例子:
def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left = merge_sort(arr[:mid]) # 拆分左子数组并递归排序 right = merge_sort(arr[mid:]) # 拆分右子数组并递归排序 # 合并左右有序子数组 merged = [] i = j = 0 while i < len(left) and j < len(right): if left[i] < right[j]: merged.append(left[i]) i += 1 else: merged.append(right[j]) j += 1 merged.extend(left[i:]) merged.extend(right[j:]) return merged
这里的left和right都是当前递归函数内的局部变量,合并后的merged直接返回给上层调用,完全不会有作用域问题。
2. 使用辅助数组进行原地合并(节省空间)
如果想优化空间复杂度,可以用一个全局或上层作用域的辅助数组,递归时只传递索引范围,而不是创建新数组。这样所有合并操作都基于原数组和辅助数组的索引来完成,避免频繁创建新数组。
伪代码示例:
def merge_sort_in_place(arr): aux = arr.copy() # 辅助数组,在顶层创建,所有递归层级都能访问 def sort(low, high): if low >= high: return mid = (low + high) // 2 sort(low, mid) sort(mid+1, high) merge(low, mid, high) def merge(low, mid, high): # 把原数组的当前段复制到辅助数组 for k in range(low, high+1): aux[k] = arr[k] i, j = low, mid+1 for k in range(low, high+1): if i > mid: arr[k] = aux[j] j += 1 elif j > high: arr[k] = aux[i] i += 1 elif aux[i] < aux[j]: arr[k] = aux[i] i += 1 else: arr[k] = aux[j] j += 1 sort(0, len(arr)-1) return arr
这里的aux数组在顶层函数创建,内部递归的sort和merge函数都能访问它,通过索引操作来合并,既避免了作用域问题,又减少了数组创建的开销。
踩过的坑提醒
- 千万别在递归的深层函数里创建数组后不返回,上层函数根本拿不到结果,这就是你说的“超出作用域”问题。
- 如果用辅助数组,一定要注意索引的边界,别越界访问,不然容易出bug。
内容的提问来源于stack exchange,提问作者gooflord
相关产品推荐
相关产品推荐

