Python归并排序实现
简介
归并排序是一种基于分治策略的排序算法,它将数组分成两个子数组,然后分别对这两个子数组进行排序,最后将两个有序的子数组合并成一个有序的数组。这个过程可以通过递归来实现。
在本文中,我将教会你如何使用Python实现归并排序算法,并详细解释每一步所需的代码和其作用。
流程图
journey
title 归并排序流程
section 初始化
给定一个待排序的数组
section 归并排序
将数组分成两个子数组
对每个子数组进行排序(递归)
合并两个有序的子数组
section 返回结果
返回排序后的数组
关系图
erDiagram
SORT -- SUBDIVIDE: 分割成两个子数组
SUBDIVIDE -- SORT: 递归排序
SORT -- MERGE: 合并两个有序的子数组
SUBDIVIDE -- MERGE: 合并两个有序的子数组
MERGE -- SORT: 递归排序
SORT -- RESULT: 返回结果
代码实现
下面是使用Python实现归并排序算法的代码:
def merge_sort(arr):
# 递归终止条件
if len(arr) <= 1:
return arr
# 将数组分成两个子数组
mid = len(arr) // 2
left = arr[:mid]
right = arr[mid:]
# 递归对子数组进行排序
left = merge_sort(left)
right = merge_sort(right)
# 合并两个有序的子数组
return merge(left, right)
def merge(left, right):
merged = []
i = 0
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
代码解释
下面是上述代码中各部分的解释:
merge_sort
函数接受一个待排序的数组作为参数,首先判断递归终止条件,即数组长度小于等于1时直接返回数组。- 接下来,将数组分成两个子数组,通过取中间索引
mid
来实现。使用Python的切片操作可以方便地实现这一步骤。 - 对两个子数组分别进行递归排序,即调用
merge_sort
函数对左子数组和右子数组进行排序,得到经过排序的左子数组left
和右子数组right
。 - 最后,调用
merge
函数将两个有序的子数组合并成一个有序的数组,并返回结果。
对于merge
函数,它接受两个有序的子数组left
和right
作为参数,首先创建一个空列表merged
用于存放合并后的数组,然后使用两个指针i
和j
分别指向左子数组和右子数组的起始位置。
接下来,比较两个子数组的元素,并将较小的元素添加到合并后的数组merged
中。如果左子数组的当前元素小于右子数组的当前元素,则将左子数组的当前元素添加到merged
中,并将左指针i
向右移动一位;否则将右子数组的当前元素添加到merged
中,并将右指针j
向右移动一位。
最后,将剩余的元素添加到合并后的数组merged
中,这一步是为了处理左子数组或右子数组中可能剩余的元素。
总结
在本文中,我介绍了如何使用Python实现归并排序算法。通过分割数组、递归排序和合并两个有序的子数组,我们