目录
Python 归并排序算法详解
1. 归并排序原理
2. Python 代码实现
3. 时间复杂度分析
4. 空间复杂度分析
5. 实际例子
6. 归并排序的优势和劣势
优势
劣势
7. 总结
归并排序(Merge Sort)是一种高效的、基于比较的排序算法,属于分治法的一种。本文将详细介绍归并排序的原理、Python 代码实现、时间复杂度分析和实际例子。
归并排序的基本思想是将待排序的序列分成若干个小序列,每个小序列单独排序,然后再将这些有序的小序列合并成一个整体有序的序列。具体步骤如下:
下面是归并排序的 Python 实现:
def merge_sort(arr):
if len(arr) <= 1:
return arr
# 分解
mid = len(arr) // 2
left_half = arr[:mid]
right_half = arr[mid:]
# 解决
left_sorted = merge_sort(left_half)
right_sorted = merge_sort(right_half)
# 合并
return merge(left_sorted, right_sorted)
def merge(left, right):
sorted_arr = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
sorted_arr.append(left[i])
i += 1
else:
sorted_arr.append(right[j])
j += 1
# 将剩余的元素添加到结果列表中
sorted_arr.extend(left[i:])
sorted_arr.extend(right[j:])
return sorted_arr
# 测试
arr = [38, 27, 43, 3, 9, 44, 1]
sorted_arr = merge_sort(arr)
print("Sorted array:", sorted_arr)
归并排序的时间复杂度为 O(nlogn),其中 n 是数组的长度。具体分析如下:
因此,总的复杂度为 O(nlogn)。
归并排序的空间复杂度为 O(n),因为需要额外的空间来存储临时数组。
我们可以通过一个具体的例子来理解归并排序的过程:
假设有一个数组 [38, 27, 43, 3, 9, 44, 1]
,归并排序的过程如下:
分解:
[38, 27, 43, 3, 9, 44, 1]
分解为 [38, 27, 43]
和 [3, 9, 44, 1]
。[38, 27, 43]
继续分解为 [38, 27]
和 [43]
。[3, 9, 44, 1]
继续分解为 [3, 9]
和 [44, 1]
。[38, 27]
继续分解为 [38]
和 [27]
。[3, 9]
继续分解为 [3]
和 [9]
。[44, 1]
继续分解为 [44]
和 [1]
。合并:
[38]
和 [27]
合并为 [27, 38]
。[3]
和 [9]
合并为 [3, 9]
。[44]
和 [1]
合并为 [1, 44]
。[27, 38]
和 [43]
合并为 [27, 38, 43]
。[3, 9]
和 [1, 44]
合并为 [1, 3, 9, 44]
。[27, 38, 43]
和 [1, 3, 9, 44]
合并为 [1, 3, 9, 27, 38, 43, 44]
。最终,数组 [38, 27, 43, 3, 9, 44, 1]
被排序为 [1, 3, 9, 27, 38, 43, 44]
。
归并排序是一种高效的排序算法,特别适合处理大规模数据。通过分治法的思想,将大问题分解成小问题,再将小问题的解决方案合并成大问题的解决方案。