赞
踩
归并排序采用分治法 (Divide and Conquer) 的一个非常典型的应。归并排序的思想就是先递归分解数组,再合并数组。归并排序是一种稳定的排序方法。
将数组分解最小之后(数组中只有一个元素,数组有序);然后合并两个有序数组,基本思路是比较两个数组的最前面的数谁小就先取谁,然后相应的指针就往后移一位;然后再比较,直至一个数组为空;最后把另一个数组的剩余部分复制过来即可。
和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度;代价是需要额外的内存空间。
归并排序算法是一个递归过程,边界条件为当输入序列仅有一个元素时,直接返回,具体过程如下:
- #!/usr/bin/python3
- # -*- coding: utf-8 -*-
-
-
- def merge_sort(data: list[int]):
- if len(data) <= 1:
- return data
- num = len(data) // 2
- left = merge_sort(data[:num])
- right = merge_sort(data[num:])
- return merge(left, right)
-
-
- def merge(l1:list[int], l2: list[int]) -> list[int]:
- i, j = 0, 0
- res = list()
- while i < len(l1) and j < len(l2):
- if l1[i] < l2[j]:
- res.append(l1[i])
- i += 1
- else:
- res.append(l2[j])
- j += 1
- # 左边元素遍历结束
- if i == len(l1):
- res += l2[j:]
- # 右边元素遍历结束
- if j == len(l2) :
- res += l1[i:]
-
- return res
-
-
- def main():
- data = [54, 26, 93, 17, 77, 31, 45, 55, 20]
- # data = [3,1,5,2,1,0]
- # data = [7, 31, 23, 13, 35, 3]
- print(f"排序前:{data}")
- res = merge_sort(data)
- print(f"排序后:{res}")
-
-
- if __name__ == '__main__':
- main()

排序前:[54, 26, 93, 17, 77, 31, 45, 55, 20]
排序后:[17, 20, 26, 31, 45, 54, 55, 77, 93]
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。