动图放上。


排序的核心是比较两个数的大小。两个数的排序很easy,三个数排序也只是两两比较2次,四个数排序也是两两比较两个数。

进行多次的两个数比较,无非是:获得最大值或者最小值,得出最大最小值之后,再在剩下的数里面找出最大最小值。……

冒泡排序升序排序的主要思路:

1,两两比较找到最大值,将其放到数组尾巴处,不再参与排序。

2,剩下的n-1个数继续两两比较找出最大值,放到数组倒数第二个位置。

3,一直比较……

4,直到只有最后两个数比较时,排序完成。

若有错误,请指正。

目录

一,冒泡排序是怎么进行两两比较的?

二,冒泡排序把比出来的最大值放到哪里?

三,冒泡排序需要循环多少次才能完成排序?

四,每次找最大值时,需要两两比较多少次?

五,冒泡排序总共需要两两比较多少次?

六,冒泡排序如何优化?

1,什么情况下需要优化?

2,如何实现优化?

2.1 怎么判断需要优化,进而提前结束算法?

2.2 优化方法?

七,python代码实现冒泡排序

八,python代码实现冒泡排序(优化版)


一,冒泡排序是怎么进行两两比较的?

答:从左往右相邻两个数两两比较。

二,冒泡排序把比出来的最大值放到哪里?

两两比较找出最大值之后,可以把这个最大值放到一个新数组里面,但这样浪费内存空间。重点是:冒泡排序从左往右两两比较天然的将最大值移到了数组容器最后面

三,冒泡排序需要循环多少次才能完成排序?

答:n-1次,当有n个数需要排序,需要两两比较的轮数为n-1次,即需要找出n-1个最大值,最后一个自然为最小。

四,每次找最大值时,需要两两比较多少次?

答:若当前剩下数字个数为n,则需要n-1次。很明显,他就是不停的在未排序的数字中找最大值,自然需要两两比较当前剩余数字的个数-1次。

五,冒泡排序总共需要两两比较多少次?

答:最差情况下的次数为:(n-1)(n-2)(n-3)(n-4)……

六,冒泡排序如何优化?

1,什么情况下需要优化?

1,当一个数组已经排好了顺序,我们再对其排序是毫无意义的。

2,当在排序过程中,提前出现排序完成的情况,但是算法过程还将继续,这也是无意义的。

2,如何实现优化?

2.1 怎么判断需要优化,进而提前结束算法?

当在一次找最大值的过程中,没有出现交换两个数情况,即:剩下未排序的数字已经是排好序的了。

2.2 优化方法?

设置标志位flag,当在一次找最大值的过程中,没有出现交换两个数情况,则置flag为true,结束排序。

七,python代码实现冒泡排序

import randomdef Bubble_sort(arr: list):total_circle = len(arr) - 1# 将2,1进行排序,至少需要1轮;# 将3,2,1进行排序,第一轮:2,3,1;2,1,3;第二轮:1,2,3。至少需要两轮。# ……# 将n,n-1,n-2,……进行排序,则至少需要n-1轮# 每一轮循环都把当前循环轮中的最大值沉底(冒泡排序:小的数浮出水面,大的数沉到水底)for i in range(total_circle):  # 外层循环,循环n-1次index = 0while index <= total_circle - 1:  # 内层循环,每轮循环期间,需要两两比较(n-1)-1次if arr[index] > arr[index + 1]:arr[index], arr[index + 1] = arr[index + 1], arr[index]  # 排序算法的核心:比较两个数的大小,进行交换index = index + 1  # 从左往右依次比较两个数的大小,索引+1进行移动total_circle = total_circle - 1  # 每一轮循环之后,当前轮的最大值会被移到最后面,这个值将不再参加排序。则总循环次数-1。if __name__ == '__main__':arr_test = [int(random.random() * 100) for i in range(10)]print('排序之前的列表:')print(arr_test)Bubble_sort(arr_test)print('排序之后的列表:')print(arr_test)

八,python代码实现冒泡排序(优化版)

import randomdef Bubble_sort(arr: list):total_circle = len(arr) - 1# 将2,1进行排序,至少需要1轮;# 将3,2,1进行排序,第一轮:2,3,1;2,1,3;第二轮:1,2,3。至少需要两轮。# ……# 将n,n-1,n-2,……进行排序,则至少需要n-1轮# 每一轮循环都把当前循环轮中的最大值沉底(冒泡排序:小的数浮出水面,大的数沉到水底)for i in range(total_circle):  # 外层循环,循环n-1次index = 0flag = 0  # 0表示没有交换过while index <= total_circle - 1:  # 内层循环,每轮循环期间,需要两两比较(n-1)-1次if arr[index] > arr[index + 1]:arr[index], arr[index + 1] = arr[index + 1], arr[index]  # 排序算法的核心:比较两个数的大小flag = 1index = index + 1  # 从左往右依次比较两个数的大小,索引+1进行移动if flag == 0:  # 当在一次找最大值的过程中,未交换过两个数,则直接退出排序过程,即退出外层循环。print('奇迹!排序过程中发现已经完成排序了')breaktotal_circle = total_circle - 1  # 每一轮循环之后,当前轮的最大值会被移到最后面,这个值将不再参加排序。则总循环次数-1。if __name__ == '__main__':arr_test = [int(random.random() * 100) for i in range(10)]print('排序之前的列表:')print(arr_test)Bubble_sort(arr_test)print('排序之后的列表:')print(arr_test)# 多运行几次,会出现提前排好序的情况

python冒泡排序,非常细节相关推荐

  1. python冒泡排序

    python 冒泡排序: data=[7,9,2,8,3,1,4,6,5]for i in range(len(data)): #数据长度len()就是for-in循环的次数; for j in ra ...

  2. 【转】python包导入细节

    [转]python包导入细节 包导入格式 导入模块时除了使用模块名进行导入,还可以使用目录名进行导入.例如,在sys.path路径下,有一个dir1/dir2/mod.py模块,那么在任意位置处都可以 ...

  3. python字符串的冒泡排序_如何实现python冒泡排序算法?

    冒泡排序是一种简单的排序技术,它通过比较相邻的元素遍历整个列表,对它们进行排序并交换元素,直到对整个列表进行排序. 算法:给定一个包含n个元素的列表L,这些元素的值或记录为L0, L1,-,Ln-1, ...

  4. python冒泡排序函数_python冒泡排序-Python,冒泡排序

    arr = [ 7 , 4 , 3 , 67 , 34 , 1 , 8 ] . def bubble_sort : 最近在学习Python,下面是我的一些笔记 冒泡排序 实现思路: 使用双重for循环 ...

  5. python冒泡排序原理_如何实现python冒泡排序算法?

    冒泡排序是一种简单的排序技术,它通过比较相邻的元素遍历整个列表,对它们进行排序并交换元素,直到对整个列表进行排序. 算法:给定一个包含n个元素的列表L,这些元素的值或记录为L0, L1,-,Ln-1, ...

  6. python 冒泡排序及优化_Python冒泡排序及优化

    一.冒泡排序简介 冒泡排序(Bubble Sort)是一种常见的排序算法,相对来说比较简单. 冒泡排序重复地走访需要排序的元素列表,依次比较两个相邻的元素,如果顺序(如从大到小或从小到大)错误就交换它 ...

  7. python冒泡排序算法非递归_python 冒泡排序,递归

    今天LeetCode的时候暴力求解233 问题: 给定一个整数 n,计算所有小于等于 n 的非负数中数字1出现的个数. 例如: 给定 n = 13, 返回 6,因为数字1出现在下数中出现:1,10,1 ...

  8. python冒泡排序与常用数学计算

    一 .冒泡排序: 冒泡排序: 属于交换排序; 两两比较大小,交换位置,如同水泡大的往上(右)跑; n个数从左至右编号从0到n-1,索引0和1比较,如果索引0大,则交换两者位置; 如果索引1大则不用交换 ...

  9. python mysql append_Python细节——MYSQL的to_sql的if_exists推荐使用append

    前言 本篇文章主要探索一个很小细节,就是to_sql 到我们的mysql数据库时,你是使用追加,还是替换呢? 这儿就推荐使用追加!append. 接下来给大家贴代码比较演示. 代码 假设我有一个数据, ...

最新文章

  1. sybase 数据导入mysql_Windows环境下Sybase12.5 数据库创建与导入数据库.docx
  2. R语言观察日志(part5)--利用readr和readxl包读写数据
  3. sqlserver两个日期之间的年数_SQL语句计算两个日期之间有多少个工作日的方法
  4. 引用使用_引用公文标题时,“”与《》正确使用法则
  5. springboot集成rocketmq
  6. URLDecoder.decode url转码百分号问题
  7. 极光推送JPush使用Java SDK开发
  8. MMDetection2.XX-Necks之FPN源码解析
  9. MTK平台 Android8.1 SD卡驱动能力修改
  10. Spring Boot电商项目46:购物车模块四:【添加商品到购物车】接口;(如果:接口要求返回JSON格式,而接口没有做相应的设置,是会报404错误的)
  11. 交换机、路由器、网关的概念与用途
  12. 一个k8s集群——跨云服务器部署
  13. 用antv-G2实现雷达图
  14. Ubuntu、Debian 系统安装 PHP 7.4 教程,超简单,一把梭!
  15. S32K1XX系列单片机 ——MCAL 的CAN模块配置
  16. 网站域名被劫持,域名被劫持的解决方式
  17. teamviewer13安装个人免费版
  18. 华为项目管理法读书笔记
  19. html项目答辩策划书,答辩会策划书范文.doc
  20. 电视剧《玉楼春》杀青,演员阵容曝光:影视剪辑月入3万必看指南【覃小龙课堂】

热门文章

  1. DUNS常见问题汇总(精华)
  2. 函数式编程、面向对象编程、面向过程编程
  3. 支付宝支付中enable_pay_channels和disable_pay_channels可支持的枚举
  4. json数组格式的字符串通过方法直接转换为JSONArray
  5. js常用的操作json数组
  6. 1ABCDE*3=ABCDE1
  7. [论文笔记]Face X-ray for More General Face Forgery Detection
  8. 在Microsoft outlook(家用版)利用日曆及To-do list
  9. JAVAAPI获取中文拼音(大小写字母转化)
  10. 依据CCS分类建树(方案一)