上一篇文章,介绍了一个非常快的排序算法--桶排序,但是它的缺点就是太耗资源了,这次要实现的算法就不用太耗资源了,它就是冒泡排序。


问题提出:

将以下数据升序排列:9, 2, 8, 6, 4


冒泡排序原理:

冒泡排序就是遍历数据,每次只与下一个数字比较,如果这两个数顺序不对,则与交换过来。

就上面那个问题来说,因为要升序排列,所以数字越大越排在后面。则两个数比较的时候,如果后一个数比当前数小,则顺序不对,要将这两个数交换。遍历的过程如下图:

第一次比较第一和第二个数字,9与2相比较,9比2大,顺序不对,则交换位置。

第二次比较第二与第三个数字,因为9换到了第二位,则9与8比较,9大,顺序不对,则交换位置。

以此类推,最后9就像泡泡一样升到了最后一位,我们称这样为一趟,这一趟里面有多次比较。

由于一趟只归为一个数,则如果有n个数字,则需要进行n-1趟。

因为归位后的数字不用再比较了,所以每趟只需要比较n-1-i次(i为已执行的趟数)。

由上可以得出冒泡排序的关键步骤是两个循环:

1 for(i = 0; i < n-1; i++){
2   for(j = 0; j < n-1-i; j++)
3     if(a[j] > a[j+1]){
4       temp = a[j];
5       a[j] = a[j+1];
6       a[j+1] = temp;
7     }
8 } 


python实现:

根据上述思路,用python实现也是把关键地方实现即可:

1 #假设变量已经全部定义好
2 for i in range(len-1):
3   for j in range(len-1-i):
4     if a[j] > a[j+1]:
5       a[j], a[j+1] = a[j+1], a[j]

以下是完整代码:(可以到github上下载https://github.com/DIGCreat/pythonAndAlgorithms.git)

 1 #!/usr/bin/env python
 2 # -*- coding:utf8 -*-
 3 '''
 4 简介:本程序主要是用python实现冒泡排序,程序的功能是实现
 5      降序排列。
 6
 7 作者:King  日期:2016/08/01  版本1
 8 '''
 9
10 class BubbleSort(object):
11     '''
12     self.datas:       要排序的数据列表
13     self.datas_len:   数据急的长度
14     _sort():          排序函数
15     show():           输出结果函数
16
17     用法:
18     BubbleSort(datas) 实例化一个排序对象
19     BubbleSort(datas)._sort() 开始排序,由于排序直接操作
20                               self.datas, 所以排序结果也
21                               保存在self.datas中
22     BubbleSort(datas).show()  输出结果
23     '''
24     def __init__(self, datas):
25         self.datas = datas
26         self.datas_len = len(datas)
27
28     def _sort(self):
29         #冒泡排序要排序n个数,由于每遍历一趟只排好一个数字,
30         #则需要遍历n-1趟,所以最外层循环是要循环n-1次,而
31         #每次趟遍历中需要比较每归位的数字,则要在n-1次比较
32         #中减去已排好的i位数字,则第二层循环要遍历是n-1-i次
33         for i in range(self.datas_len-1):
34             for j in range(self.datas_len-1-i):
35                 if(self.datas[j] < self.datas[j + 1]):
36                     self.datas[j], self.datas[j+1] = \
37                             self.datas[j+1], self.datas[j]
38
39     def show(self):
40         print 'Result is:',
41         for i in self.datas:
42             print i,
43         print ''
44
45 if __name__ == '__main__':
46     try:
47         datas = raw_input('Please input some number:')
48         datas = datas.split()
49         datas = [int(datas[i]) for i in range(len(datas))]
50     except Exception:
51         pass
52
53     bls = BubbleSort(datas)
54     bls._sort()
55     bls.show()


总结:

冒泡排序因为是在原数组上直接操作,所以它占的空间资源较少,在数据量不大的情况还是挺好的。但是由于算法涉及双重循环,所以在数据量大的情况下,程序运行的时间是相当长的,因为要一次一次地遍历数据。


最后有兴趣的同学可以关注我的微信公众号,可以随时及时方便看我的文章。*^_^*

扫码关注或者搜索微信号:King_diary

转载于:https://www.cnblogs.com/king-ding/p/bubblesort.html

python与冒泡排序相关推荐

  1. python实现冒泡排序完整算法_Python实现冒泡排序算法的完整实例

    冒泡排序:顾名思义就是(较小的值)像泡泡一样往上冒,(大的值)往下沉. 实现原理:依次将相邻两个数值进行比较,较小的数值移到左边,较大的数值移到右边,依次比较完第一轮后,最大的数值应该排在最右边.然后 ...

  2. python实现冒泡排序视频_Python实现冒泡排序算法的完整实例

    冒泡排序:顾名思义就是(较小的值)像泡泡一样往上冒,(大的值)往下沉. 实现原理:依次将相邻两个数值进行比较,较小的数值移到左边,较大的数值移到右边,依次比较完第一轮后,最大的数值应该排在最右边.然后 ...

  3. python实现冒泡排序视频_Python实现冒泡排序

    图文教程 上次,我们学习了Python中的循环.今天,我们做一个关于循环的练习,来加深大家的学习成果. 这个练习叫什么呢?我们就用Python实现冒泡排序 冒泡排序 要学习冒泡排序必须知道它的原理: ...

  4. Python实现冒泡排序的代码

    以下是Python实现冒泡排序的代码: 格式有点问题,重新调整一下,如下: def bubbleSort(nums):# 设置一个flag,用来判断某次循环是否发生了交换flag = Truefor ...

  5. python实现冒泡排序完整算法_利用python实现冒泡排序算法实例代码

    利用python实现冒泡排序算法实例代码 冒泡排序 冒泡排序(英语:Bubble Sort)是一种简单的排序算法.它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.遍历数 ...

  6. python 实现冒泡排序的思路和代码

    当需求提到需要从小到大的排序时,我们很自然的就会想起最基础的"冒泡排序" 冒泡排序的原理就不再多说了,网上有一大堆,以下是python实现冒泡排序的代码. 对于冒泡排序算法,如果有 ...

  7. python列表冒泡排序,Python实现简单的列表冒泡排序和反转列表操作示例

    #-*-coding:utf-8-*- #g:/python #冒泡排序 #1.定义一个列表 number=[6665,666,323,124,4442,5,123,412,55] #外循环控制冒泡排 ...

  8. python学习——python实现冒泡排序算法

    python实现冒泡排序算法 一.冒泡排序算法实现原理 基本思想 具体步骤 二.图解冒泡排序 三.py代码实现冒泡排序算法 一.冒泡排序算法实现原理 基本思想 比较相邻的元素.如果第一个比第二个大,就 ...

  9. python复习冒泡排序

    冒泡排序: 思路: 先找到最大值放到最右边: #encoding=utf-8 a=[1,9,2,8,3,6,4] print "a before change:",a for i ...

最新文章

  1. 基于ESP8266-01s 增加对于FZ35恒流电子负载WiFi接口
  2. 如何在Vim中复制到剪贴板?
  3. [深度学习] 自然语言处理 --- 基于Attention机制的Bi-LSTM文本分类
  4. codeforces1012 B. Chemical table(并查集+思维)
  5. Keil(MDK-ARM-STM32)系列教程(二)工具栏详细说明
  6. 魅族 linux 手机,魅族flyme开源,能否再现linux辉煌,为什么要开源
  7. 最好的移动安全计划:先检查风险 再对症下药
  8. cookie、localStorage和sessionStorage三者的异同
  9. 8.1、Spring Boot 属性配置
  10. webpack多页面构建优化不完全指北
  11. 【LOJ】#2187. 「SHOI2014」三叉神经树
  12. wx 2150183182
  13. 王垠:对TAOCP的真正看法
  14. Macbook Pro 安装 win10 单操作系统
  15. red5-server-1.0.6-RELEASE 启动异常
  16. iOS App Store 审核 other 处理、解决办法 The review of your app is taking longer than expected
  17. 落实等级保护工作的意义简单说明
  18. 卢卡斯定理(详细证明)
  19. 基于matlab的逻辑回归示例
  20. C语言实现两个整数相除的四舍五入和进一法

热门文章

  1. java反序列化时区,Jackson使用Java 8将Elasticsearch反序列化为LocalDateTime
  2. 关于如何修改ISA server 防火墙并行最大TCP连接数问题和优化ISA 服务器淹没缓解设置
  3. Ceph使用块设备完整操作流程
  4. Android基础新手教程——3.4 TouchListener PK OnTouchEvent + 多点触碰
  5. Ubuntu虚拟机及Petalinux开发平台安装
  6. 更改管理员密码以后网站不能启动
  7. OpenCV-python学习笔记(六)——梯度算子,边缘检测和轮廓提取
  8. ar路由器 pppoe下发ipv6 dns_手机从路由器获取IP、光猫PPPOE拨号过程、IP/VLAN
  9. scheduled 每月最后一天_单周、双周、每月?哪种定投方式收益最高?
  10. Python Debug调试技巧