Python 编程1000例(28):排序算法——计数排序法

文章目录

  • 一、计数排序法
  • 二、实例:使用计数排序法为列表中的数字进行递增排序

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

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

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

一、计数排序法

前七种排序方法都是基于数据之间进行比较交换进行排序,而接下来介绍的计数排序和基数排序都是非交换的排序。本篇博文先来看一下计数排序法。计数排序的主要思想是将待排序数据值转化为键,存储在额外开辟的数组空间中。计数排序要求输入的数据必须是有确定范围的整数,因此计数排序法适用于量大范围小的数据,例如公司员工入职年限问题,公司员工年龄问题,高考排名问题等等。

接下来用一组数据来详细讲解计数排序法。例如有这样一组数据1、2、4、1、3、5、2、2、7、3、4,如下图所示:
在这里插入图片描述
按照递增顺序进行排序,步骤如下:

步骤1:查看原始数据最大值和最小值,确定范围。上图中的最大值是 7,因此范围是从 0~7,那么就准备 8 个桶,并且给桶进行编号,如图所示:
Python 编程1000例(28):排序算法——计数排序法_第1张图片
步骤2:将对应的数字依次放到各个桶中,并且开始计数,例如第一个数字 1,放到 1 号桶且计数个数是 1;第二个数字是 2,放到 2 号桶且计数个数是 1;第三个数字 4,放在 4 号桶并计数个数 1;第四个数字是 1,依然放在 1 号桶中,此时计数个数升为 2,如下图所示:
Python 编程1000例(28):排序算法——计数排序法_第2张图片
步骤3:按照第 2 步的规律,将后续的数字依次放入各个桶中,并计数个数,最终的 7 个桶情况以及计数个数情况如图所示:
Python 编程1000例(28):排序算法——计数排序法_第3张图片
步骤4:放入桶中之后,从1号桶~7号桶,依次取出数据。例如先去 1 号桶中的两个数字 1,然后取出 2 号桶中的三个 2……,按照此规律将全部数据取出,最终取出的结果如图所示:
在这里插入图片描述
从上图的结果来看,已经将数据排序好,这就是计数排序法的过程。接下来用 Python 代码实现计数排序法。

二、实例:使用计数排序法为列表中的数字进行递增排序

具体代码如下:

def count_sort(data, maxValue):  # 定义计数排序,data是列表数据,maxValue表示最大值
    bucket_len = maxValue + 1  # 定义桶的长度是最大值加1,桶号从0开始
    bucket = [0] * bucket_len  # 初始化桶
    count = 0  # 计数个数
    arr_len = len(data)  # 列表长度
    for i in range(arr_len):  # 遍历列表
        if not bucket[data[i]]:  # 列表数据不为桶号
            bucket[data[i]] = 0  # 这时初始化从0将列表数据做桶号
        bucket[data[i]] += 1  # 桶号依次加1
    for j in range(bucket_len):  # 遍历桶
        while bucket[j] > 0:  # 将列表数据放在对应桶号内
            data[count] = j
            count += 1  # 计数个数加1
            bucket[j] -= 1  # 个数减一,下一个相同的元素往前排
    return data  # 返回排序后的列表


data = [1, 2, 4, 1, 3, 5, 2, 2, 7, 3, 4]
print("排序前列表数据:")
for i in range(11):
    print("%2d" % data[i], end="")
print()
data2 = count_sort(data, 7)  # 调用计数排序函数
print("排序后列表数据:")
for j in range(11):
    print("%2d" % data2[j], end="")

运行结果如下图所示:
Python 编程1000例(28):排序算法——计数排序法_第4张图片
从上图来看,最后的运行结果与文章刚开始分析的结果一模一样。

感谢您阅读本篇博文,希望本文能成为您编程路上的领航者。祝您阅读愉快!


在这里插入图片描述

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

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