用Python实现十大经典排序算法-插入、选择、快速、冒泡、归并等
本文来用图文的方式详细讲解了Python十大经典排序算法 —— 插入排序、选择排序、快速排序、冒泡排序、归并排序、希尔排序、插入排序、桶排序、基数排序、计数排序算法,想要学习的你们,继续阅读下去吧,如果觉得不错的话,推荐给身边的朋友吧。
插入排序
思路
- 从第一个元素开始,该元素可以认为已经被排序;
- 取出下一个元素,在已经排序的元素序列中从后向前扫描;
- 如果该元素(已排序)大于新元素,将该元素移到下一位置;
- 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
- 将新元素插入到该位置;
- 重复步骤2~5。
代码
图示
平均时间复杂度
O(n^2)
希尔排序
前言
希尔排序是插排的升级,先将待排序的元素进行分组,在分组的基础上进行插排,从而降低整体上的时间复杂度。
这里面设计到一个增量的概念,我们依据增量来决定分组的跨度。常用的增量有三种:
- 希尔增量 [1,2,4,8,…,2^(k-1)]
- 海巴德增量 [1,3,7,15,…,2^k-1]
- 塞基维克增量 [1,5,19,41,…,4k-3*2k+1]
一般情况下希尔增量带来的时间复杂度小于O(n2),但在极坏情况下可能效果不明显甚至超过这个值。海巴德增量可以将时间复杂控制在O(n(3/2))以下,而塞基维克增量该项参数为O(n^(4/3))。
思路
- 择定增量
- 分组
- 组内比较
- 重复步骤2,3直到跨度为1
图示
代码
选择排序
思路
- 选出数组中最大(最小)的元素放到开头
- 在剩下的元素中选中最大(最小)元素放到上个被选元素之后
- 重复2步骤
图示
代码
平均时间复杂度
O(n^2)
堆排序
前言
堆排序,顾名思义,就是基于堆。因此先来介绍一下堆的概念。
堆分为最大堆和最小堆,其实就是完全二叉树。最大堆要求节点的元素都要大于其孩子,最小堆要求节点元素都小于其左右孩子,两者对左右孩子的大小关系不做任何要求,其实很好理解。有了上面的定义,我们可以得知,处于最大堆的根节点的元素一定是这个堆中的最大值。其实我们的堆排序算法就是抓住了堆的这一特点,每次都取堆顶的元素,将其放在序列最后面,然后将剩余的元素重新调整为最大堆,依次类推,最终得到排序的序列。
思路
- 把堆顶的最大数取出
- 将剩余的堆继续调整为最大堆
- 重复步骤1,2
图示
代码
平均时间复杂度
O(nlogn)
冒泡排序
思路
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
图示
代码
平均时间复杂度
O(n^2)
快速排序
思路
- 先从集合中取出一个数作为“哨兵”
- 将集合中比哨兵大的元素和比哨兵小的元素分列两侧
- 再对左右区间重复第二步,直到各区间只有一个数
图示
代码
平均时间复杂度
O(nlogn)
归并排序
思路
- 将列表拆分成两个有序子模块
- 递归拆分
- 子模块内部进行排序并合并成大的模块
- 递归合并
图示
代码
平均时间复杂度
O(nlogn)
计数排序
思路
- 找出集合中最小数m和最大数n
- 建一个长为(m-n+1)的列表count_list,所有元素初始化为0
- 遍历集合,元素减去n得到的结果作为index,将count_list该位上的元素加1。
- 初始化空列表result。
- 将count_list序列化,用索引值减去n,得到的结果追加到result中,索引值对应的位元素值减1,直到它为0。
- 重复步骤5。
图示
代码
平均时间复杂度
O(n)
桶排序
前言
桶排序是将待排序集合中处于同一个值域的元素存入同一个桶中,也就是根据元素值特性将集合拆分为多个区域,则拆分后形成的多个桶,从值域上看是处于有序状态的。对每个桶中元素进行排序,则所有桶中元素构成的集合是已排序的。
思路
- 根据待排序集合中最大元素和最小元素的差值范围和映射规则,确定申请的桶个数;
- 遍历待排序集合,将每一个元素移动到对应的桶中;
- 对每一个桶中元素进行排序,并移动到已排序集合中。
图示
代码
平均时间复杂度
O(n^2)
基数排序
思路
- 首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶中;
- 接下来将这些桶中的数值重新串接起来,成为以下的数列。接着再进行一次分配,这次是根据十位数来分配;
- 接下来将这些桶中的数值重新串接起来,持续进行以上的动作直至最高位数为止。
图示
代码
平均时间复杂度
O(d*2*n), 这里的d是数值位数
本文来自热心好友原味吐司的投稿,点赞!
更多有关python、深度学习和计算机编程的精彩内容,可以关注微信公众号:码农的后花园

用Python实现十大经典排序算法-插入、选择、快速、冒泡、归并等的更多相关文章
- python实现十大经典排序算法
Python实现十大经典排序算法 代码最后面会给出完整版,或者可以从我的Githubfork,想看动图的同学可以去这里看看: 小结: 运行方式,将最后面的代码copy出去,直接python sort. ...
- Python实现十大经典排序算法(史上最简单)。
十大排序算法(Python实现)一. 算法介绍及相关概念解读 算法分类十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn), ...
- Python实现十大经典排序算法(史上最简单)
十大排序算法(Python实现)一. 算法介绍及相关概念解读 算法分类十种常见排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn), ...
- python基础__十大经典排序算法
用Python实现十大经典排序算法! 排序算法是<数据结构与算法>中最基本的算法之一.排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大, ...
- 十大经典排序算法(python实现)(原创)
个人最喜欢的排序方法是非比较类的计数排序,简单粗暴.专治花里胡哨!!! 使用场景: 1,空间复杂度 越低越好.n值较大: 堆排序 O(nlog2n) O(1) 2,无空间复杂度要求.n值较大: 桶排序 ...
- 十大经典排序算法最强总结(含Java、Python码实现)
引言 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作.排序算法,就是如何使得记录按照要求排列的方法.排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面 ...
- 十大经典排序算法+sort排序
本文转自:十大经典排序算法,其中有动图+代码详解,本文简单介绍+个人理解. 排序算法 经典的算法问题,也是面试过程中经常被问到的问题.排序算法简单分类如下: 这些排序算法的时间复杂度等参数如下: 其中 ...
- 十大经典排序算法的 JavaScript 实现
计算机领域的都多少掌握一点算法知识,其中排序算法是<数据结构与算法>中最基本的算法之一.排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大 ...
- JavaScript 数据结构与算法之美 - 十大经典排序算法汇总(图文并茂)
1. 前言 算法为王. 想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手:只有内功深厚者,前端之路才会走得更远. 笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 ...
随机推荐
- h5css产品模块设计
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 用python悄悄记录了室友的抖音在线时间
今天给大家分享一篇有趣的文章,灵感来自于前几天与室友的聊天,他告诉我抖音可以实时显示人的在线情况,如下图: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在 ...
- MinIO很强-让我放弃FastDFS拥抱MinIO的8个理由
目前可用于文件存储的网络服务选择有很多,比如阿里云OSS.七牛云.腾讯云等等,但是收费都有点小贵.为了帮公司节约成本,之前一直是使用fastDFS作为文件服务器,准确的说是图片服务器.直到我发现了Mi ...
- javascript函数的笔记
1.函数的概念 封装一段可以被重复调用执行的代码块来实现大量代码的重复使用 2.函数的使用分为两步:声明函数 和 调用函数 3.声明函数的关键字全部是小写 4.函数名一 ...
- Canal v1.1.4版本避坑指南
前提 在忍耐了很久之后,忍不住爆发了,在掘金发了条沸点(下班时发的): 这是一个令人悲伤的故事,这条情感爆发的沸点好像被屏蔽了,另外小水渠(Canal意为水道.管道)上线一段时间,不出坑的时候风平浪静 ...
- 自己动手编写一个Mybatis插件:Mybatis脱敏插件
1. 前言 在日常开发中,身份证号.手机号.卡号.客户号等个人信息都需要进行数据脱敏.否则容易造成个人隐私泄露,客户资料泄露,给不法分子可乘之机.但是数据脱敏不是把敏感信息隐藏起来,而是看起来像真的一 ...
- Vercel托管博客
背景 本站已托管至Vercel,但作为一名前端小白,昨天帮朋友托管博客到Vercel的过程中到处碰壁,就想写一篇博客记录一下. 注册登录 点击Vercel官网{% btn 'https://verce ...
- Pycharm 2020.01亲测激活到2089年
Pycharm 2020.01亲测激活到2089年,注意是2020.01版本. 下载jetbrains-agent.jar 链接: https://pan.baidu.com/s/1w1i15pT38 ...
- python接口自动化 - 断言(上)
我们在做接口自动化的时候会用当unittest框架,这个框架中是有assert方法 当我们写好我们的case后 总要有个验证是否正确的东西,assert就给我们提供了非常强大的结果验证 序号 断言方法 ...
- Wireshark抓包与常见问题解决
简介 Wireshark是一个网络抓包分析软件,当线上出现各种连接相关的问题,如连接不复用,大量CLOSE_WAIT时,可以方便的使用Wireshark抓包软件进行抓包分析 安装 Wirewark在w ...