实现归并排序
字数 426 2025-10-27 22:19:40
实现归并排序
题目描述:给定一个整数数组,使用归并排序算法将其按升序排列。归并排序是一种典型的分治算法,通过递归地将数组分成两半分别排序,然后将两个有序子数组合并成一个有序数组。
解题过程:
-
理解分治思想
- 归并排序的核心是"分而治之":将大问题分解成小问题,解决小问题后合并结果
- 具体步骤:分解→解决→合并
-
分解阶段
- 找到数组的中间位置:mid = (left + right) // 2
- 将数组分成左右两个子数组:
- 左子数组:从left到mid
- 右子数组:从mid+1到right
- 递归地对左右子数组进行归并排序
-
合并阶段(关键步骤)
- 创建临时数组存放合并结果
- 使用双指针法比较两个子数组的元素
- 将较小的元素依次放入临时数组
- 将剩余元素复制到临时数组
- 将临时数组复制回原数组
-
具体实现细节
def merge_sort(arr, left, right): if left >= right: # 基线条件:子数组长度为0或1 return mid = (left + right) // 2 merge_sort(arr, left, mid) # 排序左半部分 merge_sort(arr, mid + 1, right) # 排序右半部分 merge(arr, left, mid, right) # 合并两个有序子数组 def merge(arr, left, mid, right): temp = [] # 临时数组 i, j = left, mid + 1 # 双指针 # 比较并合并 while i <= mid and j <= right: if arr[i] <= arr[j]: temp.append(arr[i]) i += 1 else: temp.append(arr[j]) j += 1 # 复制剩余元素 while i <= mid: temp.append(arr[i]) i += 1 while j <= right: temp.append(arr[j]) j += 1 # 将临时数组复制回原数组 for k in range(len(temp)): arr[left + k] = temp[k] -
算法特性分析
- 时间复杂度:O(nlogn)
- 空间复杂度:O(n)(需要临时数组)
- 稳定性:稳定排序(相等元素相对位置不变)
- 适用场景:适合链表排序、外部排序