Python 编程1000例(24):排序算法——合并排序法

文章目录

  • 一、合并排序法
  • 二、实例:使用合并排序法进行递增排序
  • 三、练习:“双十一”品牌手机销量排名

本系列文章通过 1000(一篇文章表示 1 个实例) 个实例 ,为读者提供较为详细的练习题目,以便读者举一反三,深度学习。本系列的文章涉及到 Python 知识点包括:Python 语言基础、运算符和表达式、语句和程序结构、列表和元组、字典和集合、字符串、正则表达式、函数、面向对象编程、模块和包、异常处理和程序调试、文件和目录操作、数据库编程、界面编程、网络编程、WEB 编程、进程和线程、网络爬虫、游戏编程等知识点,由易到难,由浅入深,一步步打下坚实的编程基础。

本系列文章涉及的算法包括搜索、回溯、递归、排序、迭代、贪心、分治和动态规划等,涉及的数据结构包括字符串、列表、指针、区间、队列、矩阵、堆栈、链表、哈希表、线段树、二叉树、二叉搜索树和图结构等。

本系列文章是笔者为适应当前教育改革的创新要求,更好地践行语言类课程,满足实践教学与创新能力培养的需要,阅读大量书籍、各大互联网公司的面试算法、LintCode、LeetCode、九章算法和结合笔者近几年项目经验编写的系列文章,精选了 1000 个趣味性、实用性强的应用实例,从不同难度、不同算法、不同类型和不同数据结构等方面,将实际算法进行总结,希望为 Python 编程人员抛砖引玉。由于笔者经验与水平有限,博文中疏漏及不妥之处在所难免,衷心地希望各位读者在评论区多提宝贵意见及具体的修改建议,以便笔者进一步修改和完善。

一、合并排序法

合并排序法是针对已经排序好的两个或两个以上的数列,通过合并的方式,将其组合成一个大的且排序好的数列。首先是将无序的数列分成若干小份,分若干份的规则就是不断把每段长度除以2(对半分),直到分到不能再分为止,然后对分好的数列进行排序,最后再逐步合并成一个排序好的大数列,如下图所示:
Python 编程1000例(24):排序算法——合并排序法_第1张图片
合并排序法最后的结果也有两种形式,即递增数列和递减数列。接下来通过一组数据来演示合并排序法的排序原理。例如,有这样一组数据:33,10,49,78,57,96,66,21,如下图所示:
在这里插入图片描述
按照递增进行排序,步骤如下:

步骤1:将原始数列一分为二,得到两个数列,即数列1和数列2,数列1为33,10,49,78;数列2为57,96,66,21,如下图所示:
在这里插入图片描述
步骤2:再分别将上图所示的数列1和数列2分别一分为二,得到数列a、数列b、数列c和数列d。此时每个数列中包含两个数据,并将每份中的两个数据进行排序,如下图所示:
Python 编程1000例(24):排序算法——合并排序法_第2张图片
步骤3:将上图中排序好的数列元素进行合并,将数列a与数列b合并为数列A;将数列c与数列d合并为数列B。再对数列A和数列B中的数据元素进行排序,如下图所示:
在这里插入图片描述
步骤4:将上图中的数列A与数列B合并为一个数列,并将其内部的数据进行排序。最终的排序结果如下图所示:
在这里插入图片描述
至此,排序完成。

二、实例:使用合并排序法进行递增排序

使用合并排序法为列表:33,10,49,78,57,96,66,21进行排序。具体代码如下:

def merge_sort(data):  # 自定义合并排序法函数
    if len(data) <= 1:  # 判断列表元素是否小于或等于1
        return data  # 当列表元素只有一个的时候,直接返回
    mid = len(data) // 2  # 分隔长度计算,整个数据的长度除以2取整
    left = data[:mid]  # 左半边数据
    right = data[mid:]  # 右半边数据
    left = merge_sort(left)  # 调用merge_sort()函数继续对左半边分隔并排序
    right = merge_sort(right)  # 调用merge_sort()函数继续对右半边分隔并排序
    # 递归地进行排序
    result = []  # 用来存储结果值
    while left and right:  # 循环合并,判断条件是:左下标和右下标是否为真
        if left[0] <= right[0]:  # 判断左边数小于右边数
            result.append(left.pop(0))  # 结果增加left[0]的值
        else:
            result.append(right.pop(0))  # 结果增加right[0]的值
    if left:  # 如果left的值为真
        result += left  # 结果显示左侧数据
    if right:  # 如果right的值为真
        result += right  # 结果显示右侧数据
    return result  # 返回排序后的结果


data = [33, 10, 49, 78, 57, 96, 66, 21]  # 创建数列并初始化
print("原始数据为:", data)  # 输出原始数据
print('------------------------------------------------------')  # 输出分界符
print("排序之后的数据为:", merge_sort(data))  # 调用函数,输出排序好的数据
print('------------------------------------------------------')  # 输出分界符

程序运行结果如下图所示:
Python 编程1000例(24):排序算法——合并排序法_第3张图片

三、练习:“双十一”品牌手机销量排名

“双十一”是每年的购物狂欢节,参与的商家不尽其数,当然品牌手机也是“双十一”的热门销售商品之一。假设某五个品牌手机销售量(单位是万台)分别是:2750,3429,1632,4019,3698。利用合并排序法给销售量按照从高到低的顺序排序,具体代码如下:

def merge_sort(data):  # 自定义的合并排序法函数
    if len(data) <= 1:  # 判断列表元素是否小于或等于1
        return data  # 当列表元素只有一个的时候,直接返回
    mid = len(data) // 2  # 分隔长度计算,整个数据的长度除以2取整
    left = data[:mid]  # 左半边数据
    right = data[mid:]  # 右半边数据
    left = merge_sort(left)  # 调用merge_sort()函数继续对左半边分隔并排序
    right = merge_sort(right)  # 调用merge_sort()函数继续对右半边分隔并排序
    # 递归的进行排序
    result = []  # 用来存储结果值
    while left and right:  # 循环合并,判断条件是:左下标和右下标是否为真
        if left[0] >= right[0]:  # 判断左边数大于右边数
            result.append(left.pop(0))  # 结果增加left[0]的值
        else:
            result.append(right.pop(0))  # 结果增加right[0]的值
    if left:  # 如果left的值为真
        result += left  # 结果显示左侧数据
    if right:  # 如果right的值为真
        result += right  # 结果显示右侧数据
    return result  # 返回排序后的结果


data = [2750, 3429, 1632, 4019, 3698]  # 创建数列并初始化
print("五大品牌手机销售量如下:", data)  # 输出原始数据
print('================================')  # 输出分界符
print("从高到低排序之后的销售量如下:", merge_sort(data))  # 调用函数,输出排序好的数据
print('================================')  # 输出分界符

程序运行结果如下图所示:
Python 编程1000例(24):排序算法——合并排序法_第4张图片
感谢您阅读本篇博文,希望本文能成为您编程路上的领航者。祝您阅读愉快!


在这里插入图片描述

    好书不厌读百回,熟读课思子自知。而我想要成为全场最靓的仔,就必须坚持通过学习来获取更多知识,用知识改变命运,用博客见证成长,用行动证明我在努力。
    如果我的博客对你有帮助、如果你喜欢我的博客内容,请 点赞评论收藏 一键三连哦!听说点赞的人运气不会太差,每一天都会元气满满呦!如果实在要白嫖的话,那祝你开心每一天,欢迎常来我博客看看。
 编码不易,大家的支持就是我坚持下去的动力。点赞后不要忘了 关注 我哦!

你可能感兴趣的:(Python编程1000例,算法,列表,数据结构,python)