返回
前端之算法(三):归并排序的神秘面纱
前端
2023-11-25 17:55:29
揭秘归并排序:高效稳定的排序利器
什么是归并排序?
归并排序是一种基于分而治之思想的排序算法。它将待排序数组划分为较小的子数组,分别对这些子数组进行排序,最后将排序后的子数组合并成一个排序后的完整数组。
归并排序的工作原理
1. 分解: 将数组一分为二,得到两个较小的子数组。
2. 征服: 对两个子数组分别进行归并排序。
3. 合并: 将排好序的子数组合并成一个排好序的大数组。
归并排序代码示例
def merge_sort(arr):
"""
归并排序函数
:param arr: 待排序数组
:return: 排序后的数组
"""
n = len(arr)
if n <= 1:
return arr
mid = n // 2 # 计算中点
left = merge_sort(arr[:mid]) # 对左半部分排序
right = merge_sort(arr[mid:]) # 对右半部分排序
return merge(left, right) # 合并排序后的左右半部分
def merge(left, right):
"""
合并两个有序数组
:param left: 排序后的左半部分
:param right: 排序后的右半部分
:return: 合并后的有序数组
"""
i = 0 # 左半部分索引
j = 0 # 右半部分索引
merged = [] # 合并后的数组
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
while i < len(left):
merged.append(left[i])
i += 1
while j < len(right):
merged.append(right[j])
j += 1
return merged
归并排序的性能
归并排序具有以下性能特征:
- 时间复杂度: O(n log n)
- 空间复杂度: O(n)
- 稳定性: 稳定(相同元素的相对顺序保持不变)
归并排序的优点和缺点
优点:
- 稳定的排序算法
- 时间复杂度不受数组顺序影响
- 分治思想,易于理解和实现
缺点:
- 空间复杂度为O(n)
- 对于较小的数组,效率不如冒泡排序或插入排序
归并排序的应用
归并排序在以下场景中有着广泛的应用:
- 对大数组进行排序
- 对稳定性要求较高的场景
- 排序时间复杂度不受数组顺序影响的场景
常见问题解答
1. 什么是归并排序中的分治思想?
归并排序将大问题分解成较小的子问题,分别解决后再合并得到最终结果。
2. 归并排序的稳定性是什么意思?
稳定性意味着相同元素在排序后的数组中保持相对顺序不变。
3. 归并排序与快速排序有什么区别?
归并排序是稳定的排序算法,时间复杂度为O(n log n);快速排序是非稳定的排序算法,时间复杂度为O(n log n),但常数因子较小。
4. 为什么归并排序的空间复杂度为O(n)?
归并排序需要额外的空间来保存排序后的数组,因此空间复杂度为O(n)。
5. 归并排序适用于哪些场景?
归并排序适用于需要稳定性、时间复杂度不受数组顺序影响的大数组排序场景。