冒泡排序_Python实现
文章目录
- 什么是冒泡排序??
- 冒泡排序的详细过程
- 代码实现(第一版)
- 验证
- 优化(一)
- 代码实现(第二版)
- 验证
- 优化(二)
- 代码实现(第三版)
- 验证
冒泡排序是最基础的排序算法
什么是冒泡排序??
冒泡排序是一种基础的交换排序。
冒泡、冒泡就像水中的气泡一样,不断的往上漂浮,而冒泡算法之所以叫冒泡算法,正是因为这种算法的每一个元素都可以像小气泡一样,一点一点的向数组的一端移动。
冒泡排序的详细过程
我们把相邻的元素两两比较,当一个元素大于右侧相邻元素时,交换它们的位置;当一个元素小于或等于右侧相邻的元素时,则位置不变。 详细过程如下:
不断的交换蓝色的数字
5 | 8 | 6 | 3 | 9 | 2 | 1 | 7 |
---|---|---|---|---|---|---|---|
5 | 6 | 8 | 3 | 9 | 2 | 1 | 7 |
5 | 6 | 3 | 8 | 9 | 2 | 1 | 7 |
5 | 6 | 3 | 8 | 2 | 9 | 1 | 7 |
5 | 6 | 3 | 8 | 2 | 1 | 9 | 7 |
5 | 6 | 3 | 8 | 2 | 1 | 7 | 9 |
从最左端开始,数组中最大的元素9像汽水一起,漂浮到最右端
这时,冒泡排序的第一轮就完成了,有序区域目前就只有一个元素。
5 | 6 | 3 | 8 | 2 | 1 | 7 | 9 |
---|
下面,进行第二轮排序:
5 | 6 | 3 | 8 | 2 | 1 | 7 | 9 |
---|---|---|---|---|---|---|---|
5 | 3 | 6 | 8 | 2 | 1 | 7 | 9 |
5 | 3 | 6 | 2 | 8 | 1 | 7 | 9 |
5 | 3 | 6 | 2 | 1 | 8 | 7 | 9 |
5 | 3 | 6 | 2 | 1 | 7 | 8 | 9 |
第2轮结束后,数列右侧的有序区有2个元素,顺序如下:
5 | 3 | 6 | 2 | 1 | 7 | 8 | 9 |
---|
这样不断的迭代,直到所有的元素都是有序的为止,这就是冒泡排序的整体思想。
冒泡排序是一种稳定的排序,值相等的元素并不会打乱原本的顺序。由于该排序算法每一轮都要遍历所有元素,总共遍历(元素数量-1)轮,所有平均时间复杂度是O(n^2)
代码实现(第一版)
def sort(array):for i in range(len(array) - 1): # 外循环控制所有回合for j in range(len(array) -i -1): # 内循环实现每一轮的冒泡处理if array[j] > array[j+1]: # 如果左大于右,则交换array[j],array[j+1] = array[j+1],array[j]return array
验证
输入:
array = [5,8,6,3,9,2,1,7]
sort(array)
输出:
[1, 2, 3, 5, 6, 7, 8, 9]
优化(一)
有时,数组中的元素已经排好序了,但是程序还是会继续执行,一直到遍历完所有的轮数(元素个数-1)
在这种情况下,如果可以提前判断数组中元素已经排好序,并标记出来,剩下的轮数就可以不用执行了!
代码实现(第二版)
def sort(array):for i in range(len(array) -1): # 外循环控制所有回合issorted = True # 判断是否排序好了,初始为truefor j in range(len(array) -i-1): # 内循环实现每一轮的冒泡处理if array[j] > array[j+1]: # 如果左大于右,则交换array[j],array[j+1] = array[j+1],array[j]issorted = False # 如果有交换,说明没有排好序,则置issorted为Falseif issorted : # 如果issorted为True说明已经交换完成了,则直接退出循环breakreturn array
验证
输入:
array = [5,8,6,3,9,2,1,7]
sort(array)
输出:
[1, 2, 3, 5, 6, 7, 8, 9]
相比第一版,第二版做了一些小的改动,利用布尔变量issorted 作为标记。如果在本轮排序中,元素交换,则说明数组无序;如果没有元素交换,则说明数组已经有序,则直接跳出大循环。
优化(二)
用一个新的数组来举例说明:
3 | 4 | 2 | 1 | 5 | 6 | 7 | 8 |
---|
我们发现上面数组的左半部分是无序的,右半部分是有序,我们继续采用上面的代码,会出现明明右半部分已经排好序了,但是每一轮中,数组中相邻的元素还是会不断的去比较,故这块可以优化一下。
代码实现(第三版)
def sort(array):for i in range(len(array) -1): # 外循环控制所有回合issorted = True # 判断是否排序好了,初始为truesortBorder = len(array) -1 # 无序数组的边界,每一次更新到这里就结束了for j in range(sortBorder): # 内循环实现每一轮的冒泡处理if array[j] > array[j+1]: # 如果左大于右,则交换array[j],array[j+1] = array[j+1],array[j]issorted = False # 如果有交换,说明没有排好序,则置issorted为FalsesortBorder = j # 将无序数组的边界更新为最后一次交换元素的位置if issorted : # 如果issorted为True说明已经交换了,则直接退出循环breakreturn array
验证
输入:
array =[3,4,2,1,5,6,7,8]
sort(array)
输出:
[1, 2, 3, 5, 6, 7, 8]
优化二的关键问题在于数列有序区的界定。
按照现在的逻辑,有序区的长度和排序的轮数是一样的,即第一轮排序过后,有序区长度是1,第二轮排序后,有序区长度是2,等等
但实际上,有序区的长度可能要比认定的长度长很多,如上面的例子一样。
那么我们该如何解决呢? 我们可以在每一轮交换完之后,记录一下最后一次元素交换的位置,这个位置就是无序数组和有序数组的界限。
冒泡排序_Python实现相关推荐
- 冒泡排序_python实现冒泡排序
冒泡排序是比较经典的面试题, 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小.首字母从A到Z)错误就把他们交换过来.走访元素的工作是重复地进行直到没有相邻元素需要交换 ...
- python 冒泡排序_Python中的冒泡排序
# 冒泡排序:排序是计算机内经常进行的一种操作,其目的是将一组"无序"的记录序列调整为"有序"的记录序列 # 冒泡排序是排序算法中最为基础和经典的一种算法 # ...
- 使用python完成冒泡排序_python 冒泡排序优化,用递归实现冒泡排序
下面代码是冒泡排序逐步优化,写代码用递归也可以实现.什么冒泡排序就不写了,百度解释很详细.对理论不是很感兴趣. #!/usr/bin/env python3 # -*- coding: utf-8 - ...
- python遍历数组冒泡排序_Python算法(一) 数组冒泡排序(难度等级:easy)
冒泡排序(Bubble Sort)是一种典型的交换排序算法,通过交换数据元素的位置进行排序. 算法原理:从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队 ...
- c++冒泡排序_python+C、C++混合编程的应用
TIOBE每个月都会新鲜出炉一份流行编程语言排行榜,这里会列出最流行的20种语言. 排序说明不了语言的好坏,反应的不过是某个软件开发领域的热门程度.语言的发展不是越来越common,而是越来越专注领域 ...
- python输入十个数用冒泡排序_python 冒泡排序法
我们先看一个代码: 这段代码的意思是:利用随机整数函数randint()生成1到35的随机数.通过while循环10次,生 成10个这样的随机数.将生成的10个随机数组成一个列表,并用冒泡排序法来对该 ...
- python解题冒泡排序_python 冒泡排序,快排
一.冒泡排序 1.1.冒泡的原理 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 针对所有的 ...
- python随机生成10个数字进行冒泡排序_Python实现冒泡排序
冒泡排序(Bubble Sort),是经典的排序算法,基本上我们学习任何语言都会接触到冒泡排序. 它的算法思想是,重复地遍历要排序的列表,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历列表 ...
- python列表冒泡排序_python – 冒泡排序已排序列表
正如Jorge在回答中所示,但是没有解释(如关闭喷射)在泡泡中放置一个默认为True或False的布尔变量,无论你选择什么,如果你进行交换并将结果返回到最后,则将其值更改为oposite,如果从bub ...
- python实现冒泡排序完整算法_Python实现冒泡排序算法的完整实例
冒泡排序:顾名思义就是(较小的值)像泡泡一样往上冒,(大的值)往下沉. 实现原理:依次将相邻两个数值进行比较,较小的数值移到左边,较大的数值移到右边,依次比较完第一轮后,最大的数值应该排在最右边.然后 ...
最新文章
- 基于Centos7构建Kubernetes平台
- linux core文件的打开和分析
- stl中Priority Queues(优先队列)的基本用法
- 微信小程序之视图容器(swiper)组件创建轮播图
- python入门之玩转列表我的菜单_我的Python成长之路---第一天---Python基础(作业2:三级菜单)---2015年12月26日(雾霾)...
- 【转载】架构师需要了解的Paxos原理、历程及实战
- C#LeetCode刷题之#530-二叉搜索树的最小绝对差(Minimum Absolute Difference in BST)
- linux操作系统下建用户,如何用Linux操作系统批量建立用户的shell
- 设计模式09_代理模式
- Impala操作审计
- [文件、数据库、XML]window phone 利用StreamWriter写入文件问题
- ca锁登录显示服务器验签失败,网上报名CA登录失败解决办法
- html5标签参考手册
- 探究达梦8中索引数量与磁盘占用,查询和dml的小实验
- Region和Available Zone的区别
- 加号和减号在一起怎么读_幼儿园怎样认识加号,减号,等于号
- HTML5制作斑马线表格,HTML_CSS,JavaScript和MooTools制作斑马纹表格,简单的斑马纹表格,如果页面 - phpStudy...
- Ubuntu-Chrome 更新Flash插件
- Java8新特性 方法引用(三)
- 从coursera网站自动下载网课视频(Linux中bash操作)
热门文章
- Rust : 异步编程
- (转)惊魂24小时!真实还原光大“乌龙指”事件,比小说还离奇
- Rust: Rangechar 'a'..'z' 能干什么?......待续
- 十种程序语言帮你读懂大数据的“秘密”,Julia位列其中!(转)
- SpaceX上天容易,Tesla自动驾驶难 | 凌云时刻
- 【快讯】中国首个开源协议----木兰隆重发布
- 【语音加密】基于matlab GUI语音信号加密解密(带面板)【含Matlab源码 181期】
- 【VRP】基于matlab遗传算法求解多车辆路径规划问题【含Matlab源码 1249期】
- 【混凝土强度预测】基于matlab BP神经网络混凝土强度预测【含Matlab源码 695期】
- 【元胞自动机】基于matlab元胞自动机城市规划【含Matlab源码 125期】