常用排序算法_06_归并排序

1、基本思想

归并排序采用分治法 (Divide and Conquer) 的一个非常典型的应。归并排序的思想就是先递归分解数组,再合并数组。归并排序是一种稳定的排序方法。

将数组分解最小之后(数组中只有一个元素,数组有序);然后合并两个有序数组,基本思路是比较两个数组的最前面的数谁小就先取谁,然后相应的指针就往后移一位;然后再比较,直至一个数组为空;最后把另一个数组的剩余部分复制过来即可。

和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是 O(nlogn) 的时间复杂度;代价是需要额外的内存空间。

2、算法分析

归并排序算法是一个递归过程,边界条件为当输入序列仅有一个元素时,直接返回,具体过程如下:

  1. 如果输入内只有一个元素,则直接返回,否则将长度为 n 的输入序列分成两个长度为 n/2 的子序列;
  2. 分别对这两个子序列进行归并排序,使子序列变为有序状态;
  3. 设定两个指针,分别指向两个已经排序子序列的起始位置;
  4. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间(用于存放排序结果),并移动指针到下一位置;
  5. 重复步骤 3 ~ 4 直到某一指针达到序列尾;
  6. 将另一序列剩下的所有元素直接复制到合并序列尾

3、代码实现

(1)python实现

python 复制代码
#!/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]

相关推荐
ZTLJQ7 小时前
数据的基石:Python中关系型数据库完全解析
开发语言·数据库·python
FreakStudio8 小时前
lvgl-micropython、lv_micropython和lv_binding_micropython到底啥关系?一文读懂
python·单片机·嵌入式·面向对象·电子diy
lvxiangyu118 小时前
MPPI 算法证明重构:基于无穷维泛函变分与 KL 散度的构造性推导
算法·重构·最优控制·随机最优控制
2301_818419018 小时前
C++中的解释器模式变体
开发语言·c++·算法
小江的记录本8 小时前
【Redis】Redis全方位知识体系(附《Redis常用命令速查表(完整版)》)
java·数据库·redis·后端·python·spring·缓存
ab1515178 小时前
3.25完成*23、*24、*28、*30、*33、*38、*39、*40
算法
颜酱8 小时前
回溯算法实战练习(3)
javascript·后端·算法
dinl_vin9 小时前
Python 数据分析入门系列(一):从NumPy开始
python·数据分析·numpy
小陈工9 小时前
2026年3月26日技术资讯洞察:WebAssembly崛起、AI代码质量危机与开源安全新挑战
人工智能·python·安全·架构·开源·fastapi·wasm
2401_879693879 小时前
数据分析与科学计算
jvm·数据库·python