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定义与使用选择排序的相关操作技 ...
随机推荐
- 说说 Python3 中的数字处理
最近在处理订单相关的问题,踩了数字的一些坑,在此记录下. 其中有问题的代码涉及金额比较,便于描述,假设了下面一段代码 def is_paid(pay_price, paid_price): retur ...
- 《Effective Java》 读书笔记(六)避免创建不必要的对象
java 有很多修饰类的属性的关键字:常用的static,final 说说final和static吧,平时在编程的时候,这两个关键字很多时候都觉得可有可无,最多的时候就是他们俩同时出现----定义常量 ...
- K近邻(k-Nearest Neighbor,KNN)算法,一种基于实例的学习方法
1. 基于实例的学习算法 0x1:数据挖掘的一些相关知识脉络 本文是一篇介绍K近邻数据挖掘算法的文章,而所谓数据挖掘,就是讨论如何在数据中寻找模式的一门学科. 其实人类的科学技术发展的历史,就一直伴随 ...
- NOIP模拟 5
考试的时候相当浮躁,而且脑子并不工作 T1看了几眼,觉得没思路,先skip T2一打眼,满足条件的最大值,二分!(然后就死了,根本没想有没有单调性) T3找了半天规律,一开始自己手模的K3都过不了样例 ...
- P2114 [NOI2014]起床困难综合症
#include<iostream> #include<cstdio> using namespace std; ; ]; long long n,m; long long t ...
- P3043 [USACO12JAN]牛联盟Bovine Alliance——并查集
题目描述 给出n个点m条边的图,现把点和边分组,每条边只能和相邻两点之一分在一组,点可以单独一组,问分组方案数. (友情提示:每个点只能分到一条边,中文翻译有问题,英文原版有这样一句:The cows ...
- ssm整合的登录
新建一个web工程,主要结构如下: 数据库创建如下: 控制层的代码FormController 类 package codeRose.controller; import org.springfram ...
- Linux | 性能分析系列学习 (2)
常分析方法: 1.监控大盘,是否异常报警 2..平均负载情况,(top / htop )平均负载体现的是系统的一个整体情况,他应该是cpu.内存.磁盘性能的一个综合,一般是平均负载的值大于 ...
- PHP防止客户端多次点击
PHP防止客户端多次点击 第一种用ip判断 第二种就是用 用户名第三种就是cookie仅限 H5第四种 用swoole 用swoole id
- F#周报2019年第46期
新闻 使用Pulumi和.NET Core创建现代云应用 宣告.NET Core 3.1预览版3 ML.NET模型构建器升级 .NET Framework修复工具 Mac上的Visual Studio ...