黄金挑战:归并排序
归并排序原理
归并排序(merge-sort)简单来说就是将大的序列先视为若干个比较小的数组,分成几个比较小的结构,然后利用归并的思想实现的排序算法,该算法采用经典的分治策略
分:将问题分成一些小的问题分别求解
治:将分的阶段得到的各答案“合”在一起
如上图所示,这种结构很像两棵套在一起的满二叉树。
分阶段,可以理解为就是递归拆分子序列的过长,递归深度为 logn,就是图中上侧的满二叉树。
治阶段,需要将已经有序的子序列合并成一个有序序列,就是图中下侧的满二叉树。
代码实现
#!/usr/bin/python
# -*- coding: utf-8 -*-
# @Time : 2023/8/22 10:58 上午
# @Author : ListenYin
# @Email : yls060912@163.com
# @File : 归并排序.py
# @Project : yupisufancun
def merge(left, right):
ll, rr = 0, 0
nums = []
while ll < len(left) and rr < len(right):
if left[ll] < right[rr]:
nums.append(left[ll])
ll += 1
else:
nums.append(right[rr])
rr += 1
nums += left[ll:]
nums += right[rr:]
return nums
def merge_sort(nums):
if not nums or len(nums) <= 1:
return nums
index = (len(nums)) // 2 # 从中间划分两个子序列
left = merge_sort(nums[:index]) # 对左侧子序列进行递归排序
right = merge_sort(nums[index:]) # 对右侧子序列进行递归排序
return merge(left, right) # 归并
if __name__ == '__main__':
test1 = [1, 3, 45, 23, 23, 12, 43, 45, 33, 21]
print(merge_sort(test1)) # [1, 3, 12, 21, 23, 23, 33, 43, 45, 45]