python排序算法之一:冒泡排序(及其优化)
相信冒泡排序已经被大家所熟知,今天看了一篇文章,大致是说在面试时end在了冒泡排序上,主要原因是不能给出冒泡排序的优化。
所以,今天就写一下python的冒泡排序算法,以及给出一个相应的优化。OK,前言结束,步入正题:
首先,大家来看一下原始的python实现的冒泡排序算法:
def bubble_sort(nums): for i in range(len(nums) - 1): # 这个循环负责设置冒泡排序进行的次数(比如说n个数,则只要进行n-1次冒泡,就可以把这个n个数排序好,对吧)
for j in range(len(nums) - i - 1):
"""
这里这个j呢就是控制每一次具体的冒泡过程,请你想一想,我们第一次冒泡需要冒几次,也就是说需要比较几次,
假如有三个数,那只需要两次就可以了,当下一次时,最后一个
已经是有序的了,所以说少冒泡一次,所以这里j每次都会减去i的值,即不用冒“无用之泡泡”
"""
if nums[j] > nums[j + 1]:
nums[j], nums[j + 1] = nums[j + 1], nums[j] return nums
盗用个图,动态展示一下冒泡排序过程:
好了,终于说完原始的泡泡算法了,不对,是冒泡算法,接下来大家想一想,原始的冒泡算法存在什么问题呢?(思考ing)
相信聪明的你已经发现,这里我就帮你们说一下好了:
假设现在有一个数组[6,1,2,3,4,5],当我们进行完第一次冒泡排序过程后变为[1,2,3,4,5,6],这时候数组已经变成有序的了,程序要是再继续循环岂不是一直在做无用功,那怎么知道数组已经是有序的了呢?计算机又不跟你我一样能眼观大局,它看不到怎么办呢,于是它就再试一次呗,接下来再进行一次冒泡排序,1和2, 2和3, 3和4, 4和5, 5和6(好累,幸亏就tm六个数)依次冒泡,计算机好奇的发现,咦?奇了怪了,这次比较怎么没有一个数动一动,他们都那么懒啊,于是计算机就想,既然他们那么懒,我也不管了,老子不干了!于是乎,排序程序截止了,之后计算机惊奇的发现,输出的结果竟然排好序了!(心想,还TMD真排好了,我是谁,我在哪?)
OK,现在没计算机的事情了,需要大家帮它想一下,为什么它罢工之后反而还能输出正确结果,可以看出,当任意两个数字之间都没有发生交换,这代表着什么?这代表着任意两者之间都是有序的了啊!这代表着什么???这不就代表着这个列表已经是有序的了嘛(心想你si不si傻,这还要问,难道任意两者间有序你想不cu来人家列表已经有序了吗!!!)
到这里,终于可以放大招了,下面请看我们的冒牌排序优化版,不对是冒泡排序!!!(差点剧透了都。。。)
def bubble_sort(nums): for i in range(len(nums) - 1):
ex_flag = False # 改进后的冒泡,设置一个交换标志位
for j in range(len(nums) - i - 1): if nums[j] > nums[j + 1]:
nums[j], nums[j + 1] = nums[j + 1], nums[j]
ex_flag = True
if not ex_flag:
return nums # 这里代表计算机偷懒成功 (〃'▽'〃) return nums # 这里代表计算机没有偷懒成功 o(╥﹏╥)o
好了,上面的程序就不多做解释了,大家都是成年人,肯定能看懂的啦。
下面是福利时间,附赠大家一个冒牌排序,竟然有人声称这是冒泡排序,我是不能忍了,下面看代码:
def fake_bubble(num): # 这个是伪冒泡排序!!!
count = len(num)
for i in range(count):
for j in range(i+1, count):
if num[i] > num[j]:
num[i], num[j] = num[j], num[i]
return num
好了,来分析分析,这哪是冒泡排序啊,这不是赤裸裸的耍流氓嘛,从程序中可以看出,它的每一次循环,只是从未排序序列中取出第一个数,之后就拿这个数来依次和它后面的数相比,当然,在比较的过程中第一个数可能会变成另一个数(这实质性原因是因为它比后面的数大),但是不变的是每次都是未排序序列中第一个位置上的数依次和后面的数进行比较(这哪是冒泡啊,你是要累死第一个位置上的数吗,以后谁都不想当第一了)。这个程序只是每次都从未排序的序列中取出一个最小值,放在已排序序列的最后面,就是这样暴力,再次声明这不是冒泡排序!打假结束,收工~
python排序算法之一:冒泡排序(及其优化)的更多相关文章
- Python排序算法之冒泡排序
冒泡排序 顾名思义,冒泡排序直观的意思是气泡越大冒的越快:),对应到我们的列表中就是数字最大的先选出来,然后依次进行.例如 myList = [1,4,5,0,6],比较方式为: 相邻的两个数字先进行 ...
- python排序算法实现(冒泡、选择、插入)
python排序算法实现(冒泡.选择.插入) python 从小到大排序 1.冒泡排序: O(n2) s=[3,4,2,5,1,9] #count = 0 for i in range(len(s)) ...
- 44.python排序算法(冒泡+选择)
一,冒泡排序: 是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个,如果他们的排序错误就把他们交换过来. 冒泡排序是稳定的(所谓稳定性就是两个相同的元素不会交换位置) 冒泡排序算法的运作如下 ...
- 带你掌握4种Python 排序算法
摘要:在编程里,排序是一个重要算法,它可以帮助我们更快.更容易地定位数据.在这篇文章中,我们将使用排序算法分类器对我们的数组进行排序,了解它们是如何工作的. 本文分享自华为云社区<Python ...
- python排序之二冒泡排序法
python排序之二冒泡排序法 如果你理解之前的插入排序法那冒泡排序法就很容易理解,冒泡排序是两个两个以向后位移的方式比较大小在互换的过程好了不多了先上代码吧如下: 首先还是一个无序列表lis,老规矩 ...
- Java常见排序算法之冒泡排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- java排序算法之冒泡排序(Bubble Sort)
java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...
- [ 转载 ] js十大排序算法:冒泡排序
js十大排序算法:冒泡排序 http://www.cnblogs.com/beli/p/6297741.html
- 排序算法之冒泡排序Java实现
排序算法之冒泡排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb 选择排序:http://t.cn/hros6e 插入排序:ht ...
- Python排序算法之选择排序定义与用法示例
Python排序算法之选择排序定义与用法示例 这篇文章主要介绍了Python排序算法之选择排序定义与用法,简单描述了选择排序的功能.原理,并结合实例形式分析了Python定义与使用选择排序的相关操作技 ...
随机推荐
- srync:@ERROR: auth failed on module tee 的解决办法分析
首先:检查server端和client端的用户名和密码确认都无误: 然后:检查了服务器端/etc/rsyncd.conf 配置文件未发现异常, 再次:通过配置文件找到了log存放目录 $ cat /e ...
- Rest_Framework之频率组件部分
一.RestFramework之频率组件源码部分 频率组件的源码部分和权限组件流程一模一样的,这里就不多说了,直接上源码的主要逻辑部分: def check_throttles(self, reque ...
- eclipse 工具翻译插件安装
http://download.eclipse.org/technology/babel/update-site/R0.15.1/oxygen
- vue+element UI + axios封装文件上传及进度条组件
1.前言 之前在做项目的时候,需要实现一个文件上传组件并且需要有文件上传进度条,现将之前的实现过程简单记录一下,希望可以帮助到有需要的人. 项目用的是Vue框架,UI库使用的是element UI,前 ...
- jquery 路径动画贝塞尔动画
jquery 路径动画贝塞尔动画 <pre><!DOCTYPE html><!DOCTYPE html><html> <head> < ...
- SpringBoot 整合jdbc和mybatis
摘要 该文章主要为记录如何在SpringBoot项目中整合JDBC和MyBatis,在整合中我会使用简单的用法和测试用例,毕竟该文章目的是为了整合,而不是教大家如何去使用.希望大家多多包涵. 通用配置 ...
- Spring Cloud gateway 七 Sentinel 注解方式使用
Sentinel 注解支持 @SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项. @SentinelResource 注解包含以下属性: value:资 ...
- C++中对C的扩展学习新增语法——内联函数以及函数参数
内联函数以及函数参数 内联函数 使用 inline 关键字必须和函数体放在一起. 内联函数具有内部链接属性. 内联函数会被编译器在编译阶段替换到函数调用的地方. 可以把内联函数定义写到头文件中,多个c ...
- 为什么Python类语法应该不同?
做过python的人你会发现想要的东西跟它原有的是不同的.Python对我来说是真的是这样.如果可以的话,对于Python中很多的我想要改的东西,我有很多的想法.现在我向您讲述其中一个:类定义的语法. ...
- java编程思想第四版第十一章总结
1. 容器类被分为两类:Collection和Map Collection是一个接口:包括: List接口: ArrayList:按照被插入顺序保存元素, 查询快, 增删改慢 LinkedList:按 ...