归并排序算法

归并排序算法

python 复制代码
# 定义归并排序函数:对数组arr进行排序
def merge_sort(arr):
    # 递归终止条件:如果数组长度小于等于1,说明已经是有序的,直接返回
    if len(arr) <= 1:
        return arr

    # 计算中间索引,将数组分成左右两部分(二分法)
    mid = len(arr) // 2  # 整除操作,确保索引为整数
    left = arr[:mid]  # 左半部分:从开始到mid-1(不包含mid)
    right = arr[mid:]  # 右半部分:从mid到结束

    # 递归对左右两部分进行归并排序(分治思想)
    left_sorted = merge_sort(left)  # 对左半部分排序
    right_sorted = merge_sort(right)  # 对右半部分排序

    # 合并两个已排序的子数组,返回最终结果
    return merge(left_sorted, right_sorted)

# 定义合并函数:将两个已排序的数组left和right合并成一个有序数组
def merge(left, right):
    result = []  # 创建一个空列表,用于存储合并后的结果
    i = j = 0  # 初始化指针:i指向left数组的起始位置,j指向right数组的起始位置

    # 比较左右两个数组的元素,按从小到大的顺序放入结果数组
    # 循环条件:两个数组都还有未比较的元素
    while i < len(left) and j < len(right):
        # 如果left当前元素小于等于right当前元素
        if left[i] <= right[j]:
            result.append(left[i])  # 将left当前元素加入结果数组
            i += 1  # 移动左指针,指向left的下一个元素
        else:
            result.append(right[j])  # 将right当前元素加入结果数组
            j += 1  # 移动右指针,指向right的下一个元素

    # 当left数组还有剩余元素时,将剩余元素全部加入结果数组
    # (此时right数组已遍历完,剩余元素直接拼接)
    result.extend(left[i:])
    # 当right数组还有剩余元素时,将剩余元素全部加入结果数组
    # (此时left数组已遍历完,剩余元素直接拼接)
    result.extend(right[j:])

    return result  # 返回合并后的有序数组

# 测试代码
arr = [10, 6, 7, 1, 3, 9, 4, 2]  # 定义一个待排序的数组
sorted_arr = merge_sort(arr)  # 调用归并排序函数
print(sorted_arr)  # 输出排序结果:[1, 2, 3, 4, 6, 7, 9, 10]

循环过程中数组的变化分析(以测试用例10,6,7,1,3,9,4,2为例):
分解阶段(merge_sort 函数的递归拆分):

初始数组:10,6,7,1,3,9,4,2

第一次拆分:left=10,6,7,1,right=3,9,4,2

第二次拆分:

left再拆分为10,67,1

right再拆分为3,94,2

第三次拆分(直到数组长度为 1):

10,6\]→\[10\]和\[6

7,1\]→\[7\]和\[1

3,9\]→\[3\]和\[9

4,2\]→\[4\]和\[2

合并阶段(merge 函数的操作):

合并106

比较 10 和 6→取 6,j=1→right 遍历完→拼接 left 剩余元素→结果6,10

合并71

比较 7 和 1→取 1,j=1→right 遍历完→拼接 left 剩余元素→结果1,7

合并6,101,7

比较 6 和 1→取 1,j=1

比较 6 和 7→取 6,i=1

比较 10 和 7→取 7,j=2→right 遍历完→拼接 left 剩余元素→结果1,6,7,10

合并393,9(类似上述过程)

合并422,4(类似上述过程)

合并3,92,42,3,4,9(类似上述过程)

最终合并1,6,7,102,3,4,91,2,3,4,6,7,9,10

演示过程:

https://www.doubao.com/share/code/cfe92ba8414d8d38

相关推荐
月华路13 小时前
G1 新生代对象晋升老年代:实现机制与 GC 日志
java·jvm·算法
万法若空13 小时前
排列组合恒等式
c++·算法
Nil20813 小时前
leetcode 105从前序和中序遍历序列构造二叉树
算法·leetcode·职场和发展
一直C13 小时前
【数据结构】哈希表+算法复杂度与经典排序查找(C语言)
java·linux·开发语言·数据结构·算法·ubuntu·散列表
淡海水13 小时前
04-02-哈希-Dictionary-TKey-TValue-上-核心数据结构
数据结构·算法·c#·哈希算法·编译·字典·dictionary
戴西软件14 小时前
国内有哪些数据轻量化格式转换软件?
数据库·算法·安全·信息可视化·自动化·rpa
老洋葱Mr_Onion14 小时前
【C++】CSP-J初赛模拟卷七错题整理(作者自用)
c++·算法·深度优先
土星云SaturnCloud14 小时前
Real-ESRGAN超分辨率算法原理与边缘侧部署实践
服务器·算法·ai·边缘计算·real-esrgan
cz071014 小时前
hot100_搜索二维矩阵 II
算法·leetcode
疯狂打码的少年15 小时前
【数据结构】板块总结 + 下期预告(数据库技术)
数据结构·笔记·算法