Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >史上最简单!冒泡、选择排序的Python实现及算法优化详解

史上最简单!冒泡、选择排序的Python实现及算法优化详解

作者头像
小小科
发布于 2018-05-02 11:02:23
发布于 2018-05-02 11:02:23
1.9K0
举报
文章被收录于专栏:北京马哥教育北京马哥教育

1、排序概念

内部排序和外部排序

根据排序过程中,待排序的数据是否全部被放在内存中,分为两大类:

内部排序:指的是待排序的数据存放在计算机内存中进行的排序过程;

外部排序:指的是排序中要对外存储器进行访问的排序过程。

内部排序是排序的基础,在内部排序中,根据排序过程中所依据的原则可以将它们分为5类:插入排序、交换排序、选择排序、归并排序;根据排序过程的时间复杂度来分,可以分为简单排序、先进排序。冒泡排序、简单选择排序、直接插入排序就是简单排序算法。

评价排序算法优劣的标准主要是两条:一是算法的运算量,这主要是通过记录的比较次数和移动次数来反应;另一个是执行算法所需要的附加存储单元的的多少。

2、简单排序之冒泡法Python实现及优化

原理图

2.1、基本实现

2.2、优化实现

思路:如果本轮有交互,就说明顺序不对;如果本轮无交换,说明是目标顺序,直接结束排序。

总结

冒泡法需要数据一轮轮比较。

优化,则可设定一个标记判断此轮是否有数据交换发生,如果没有发生交换,可以结束排序,如果发生交换,继续下一轮排序

最差的排序情况是,初始顺序与目标顺序完全相反,遍历次数1,...,n-1之和n(n-1)/2

最好的排序情况是,初始顺序与目标顺序完全相同,遍历次数n-1

时间复杂度O(n^2)

3、简单排序之选择排序Python实现及优化

选择排序的核心:每一轮比较找到一个极值(最大值或最小值)放到某一端,对剩下的数再找极值,直至比较结束。

原理图

3.1、基本实现

3.2、优化实现——二元选择排序

思路:减少迭代次数,一轮确定2个数,即最大数和最小数。

3.3、等值情况优化

思路:二元选择排序的时候,每一轮可以知道最大值和最小值,如果某一轮最大最小值都一样了,说明剩下的数字都是相等的,直接结束排序。

3.4、等值情况优化进阶

思路:

[1, 1, 1, 1, 1, 1, 1, 1, 2] 这种情况,找到的最小值索引是-2,最大值索引8,上面的代码会交换2次,最小值两个1交换是无用功,所以,增加一个判断。

还可能存在一些特殊情况可以优化,但是都属于特例的优化了,对整个算法的提升有限。

总结

简单选择排序需要数据一轮轮比较,并在每一轮中发现极值

没有办法知道当前轮是否已经达到排序要求,但是可以知道极值是否在目标索引位置上

遍历次数1,...,n-1之和n(n-1)/2

时间复杂度O(n^2)

减少了交换次数,提高了效率,性能略好于冒泡法

作者:mexp 来源:http://me2xp.blog.51cto.com/6716920/1968672


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 马哥Linux运维 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
排序五 简单选择排序
该文介绍了冒泡排序算法的基本原理和实现过程,并通过示例代码和运行结果来展示冒泡排序算法的运行过程。同时,文章还对冒泡排序算法的时间复杂度和空间复杂度进行了分析。
静默虚空
2018/01/05
6380
排序五 简单选择排序
一文带你读懂排序算法(一):冒泡 & 快速选择排序 & 简单插入排序算法
排序是确保数据规则有序的有效手段。日常开发里,我们常用到的是“冒泡”、“插入排序”、“选择排序”三种。
后台技术汇
2022/05/28
2110
一文带你读懂排序算法(一):冒泡 & 快速选择排序 & 简单插入排序算法
图文并茂的排序算法
本文给出常见的几种排序算法的原理以及java实现,包括常见的简单排序和高级排序算法,以及其他常用的算法知识。
用户1212940
2022/04/13
2150
图文并茂的排序算法
【数据结构与算法】简单排序(冒泡排序、选择排序、插入排序)完整思路
本系列文章【数据结构与算法】所有完整代码已上传 github,想要完整代码的小伙伴可以直接去那获取,可以的话欢迎点个Star哦~下面放上跳转链接
@零一
2021/01/29
4430
我们真的搞懂这些排序算法了吗?(一)
或许你已经学过了这些常见的排序算法,或者你看过了别人写的文章,但是这篇文章绝对不会浪费你的时间,一定会有所收获的。
godweiyang
2021/02/24
4650
我们真的搞懂这些排序算法了吗?(一)
Java数据结构和算法总结-冒泡排序、选择排序、插入排序算法分析
前言:排序在算法中的地位自然不必多说,在许多工作中都用到了排序,就像学生成绩统计名次、商城商品销量排名、新闻的搜索热度排名等等。也正因为排序的应用范围如此之广,引起了许多人深入研究它的兴趣,直至今天
codingblock
2017/12/29
1K0
Java数据结构和算法总结-冒泡排序、选择排序、插入排序算法分析
直接选择排序到堆排序做的那些改进
主要推送关于对算法的思考以及应用的消息。坚信学会如何思考一个算法比单纯地掌握100个知识点重要100倍。本着严谨和准确的态度,目标是撰写实用和启发性的文章,欢迎您的关注,让我们一起进步吧。 01 — 你会学到什么? 彻底弄明白常用的排序算法的基本思想,算法的时间和空间复杂度,以及如何选择这些排序算法,确定要解决的问题的最佳排序算法,上个推送总结了冒泡排序和其改进后的快速排序这两个算法,下面总结直接选择排序到堆排序的改进,后面再继续总结插入排序、希尔排序、归并排序和基数排序。 02 — 讨论的问题是什么?
double
2018/04/02
8560
直接选择排序到堆排序做的那些改进
Java数据结构和算法(三)——冒泡、选择、插入排序算法
  上一篇博客我们实现的数组结构是无序的,也就是纯粹按照插入顺序进行排列,那么如何进行元素排序,本篇博客我们介绍几种简单的排序算法。 1、冒泡排序   这个名词的由来很好理解,一般河水中的冒泡,水底刚
IT可乐
2018/01/04
1.1K0
Java数据结构和算法(三)——冒泡、选择、插入排序算法
十种排序算法总结(冒泡、插入、选择、希尔、归并、堆、快速,计数,桶,基数)
该文章介绍了如何利用C++实现一个简单的HTTP服务器,包括处理客户端请求、解析请求体、返回响应以及关闭连接。主要使用了C++的流和字符串处理功能,以及基本的HTTP协议知识。
s1mba
2017/12/22
1.1K0
十种排序算法总结(冒泡、插入、选择、希尔、归并、堆、快速,计数,桶,基数)
经典排序算法和Python详解之(一)选择排序和二元选择排序
稳定排序和不稳定排序内部排序和外部排序时间复杂度和空间复杂度算法一:选择排序算法二:二元选择排序法(选择排序改进)
Minerva
2020/05/21
9850
极客算法训练笔记(五),十大经典排序之冒泡,选择,插入排序
关于排序算法的重要性我就不啰嗦了,不重要你也遇不到这篇文章。安利一个学习算法免费看动画的网站,该文的动图都来自这个网站 https://visualgo.net/zh/sorting ,感谢站长。
阿甘的码路
2020/11/06
5570
极客算法训练笔记(五),十大经典排序之冒泡,选择,插入排序
冒泡排序python实现_冒泡排序python代码优化
冒泡排序是一种简单的排序算法,它也是一种稳定排序算法。其实现原理是重复扫描待排序序列,并比较每一对相邻的元素,当该对元素顺序不正确时进行交换。一直重复这个过程,直到没有任何两个相邻的元素可以交换,就表明完成了排序。
全栈程序员站长
2022/11/03
6910
冒泡排序python实现_冒泡排序python代码优化
*常见排序算法代码实现及特性分析*
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到全部插入完为止,得到一个新的有序序列。
一半是我
2020/04/01
8130
C++ 经典排序算法
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。
老九学堂-小师弟
2019/10/09
1K0
算法---排序
简单来说,插入排序就时将一个数插入一个数插入一个有序的数组使之仍然有序,我们可以用一张动图来展示其基本原理
用户11305458
2024/10/09
800
算法---排序
冒泡排序到快速排序做的那些优化
本公众号主要推送关于对算法的思考以及应用的消息。算法思想说来有,分而治之,搜索,动态规划,回溯,贪心等,结合这些思想再去思考如今很火的大数据,云计算和机器学习,是不是也别有一番风味呢? 在这个征程中,免不了读英文博客,paper,书籍等,提升英语阅读能力也至关重要呀,为了满足大家需要,本公众号也推送这方面的消息。 01 — 你会学到什么? 彻底弄明白常用的排序算法的基本思想,算法的时间和空间复杂度,以及如何选择这些排序算法,确定要解决的问题的最佳排序算法,我们先总结下冒泡排序和其改进后的快速排序这两个算法,
double
2018/04/02
1.1K0
冒泡排序到快速排序做的那些优化
冒泡排序和简单选择排序的算法实现及优化
冒泡排序作为最基础的排序算法,其核心就是通过两两相邻的同类型数据进行比较,进行交换。一组数据经过一次比较之后,就可以最大或最小的元素放在 尾部,现实生活中很形象的例子就是冒泡,其名称也因此而来。 下面实现冒泡排序算法:
lexingsen
2022/02/24
3520
Python——关于排序算法(选择排序法)
假设首数字最小,然后依次比对,最终取得最小值的序号,也就是1的序号,然后将1与首位数字互换:
Ed_Frey
2019/07/04
6950
Python——关于排序算法(选择排序法)
【排序】插入排序与选择排序详解
选择排序是一种简单直观的排序算法。它的工作原理如下:在未排序序列中找到最小(大)元素,交换到起始位置,该元素为已排序序列的起始元素,继续在剩余未排序元素中找到最小(大)元素,交换到未排序序列起始位置,重复第二步,直到所有元素均排序完毕。
学习起来吧
2024/03/23
1690
【排序】插入排序与选择排序详解
写代码?程序猿?你不能不懂的八大排序算法的Python实现
信息获取后通常需要进行处理,处理后的信息其目的是便于人们的应用。信息处理方法有多种,通常由数据的排序,查找,插入,删除等操作。本章介绍几种简单的数据排序算法和高效的排序算法.
风骨散人Chiam
2020/10/28
3550
推荐阅读
相关推荐
排序五 简单选择排序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档