排序算法-冒泡排序-python

原创 2018年04月16日 20:23:30

1. 冒泡排序法说明

  • 冒泡法
    • 属于交换排序
    • 两两比较大小,交换位置。如同水泡咕嘟咕嘟往上冒
    • 结果分为升序和降序排列
  • 升序
    • n个数从左至右,编号从0开始到n-1,索引0和1的值比较,如果索引0大,则交换两者位置,如果索引1大,则不交换。继续比较索引1和2的值,将大值放在右侧。直至n-2和n-1比较完,第一轮比较完成。第二轮从索引0比较到n-2,因为最右侧n-1位置上已经是最大值了。依次类推,每一轮都会减少最右侧的不参与比较,直至剩下最后2个数比较。
  • 降序
    • 和升序相反

2. 冒泡排序法举例

初始 1 9 8 5 6 7 4 3 2
第一趟 1 8 9 5 6 7 4 3 2 1 8 5 9 6 7 4 3 2 1 8 5 6 9 7 4 3 2 1 8 5 6 7 9 4 3 2
1 8 5 6 7 4 9 3 2 1 8 5 6 7 4 3 9 2 1 8 5 6 7 4 3 2 9
第二趟 1 8 5 6 7 4 3 2 9 1 5 8 6 7 4 3 2 9 1 5 6 8 7 4 3 2 9 1 5 6 7 8 4 3 2 9
1 5 6 7 4 8 3 2 9 1 5 6 7 4 3 8 2 9 1 5 6 7 4 3 2 8 9
第三趟 1 5 6 7 4 3 2 8 9 1 5 6 4 7 3 2 8 9 1 5 6 4 3 7 2 8 9 1 5 6 4 3 2 7 8 9
第四趟 1 5 6 4 3 2 7 8 9 1 5 4 6 3 2 7 8 9 1 5 4 3 6 2 7 8 9 1 5 4 3 2 6 7 8 9
第五趟 1 5 4 3 2 6 7 8 9 1 4 5 3 2 6 7 8 9 1 4 3 5 2 6 7 8 9 1 4 3 2 5 6 7 8 9
第六趟 1 4 3 2 5 6 7 8 9 1 3 4 2 5 6 7 8 9 1 3 2 4 5 6 7 8 9
第七趟 1 3 2 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9
第八趟 1 2 3 4 5 6 7 8 9

3. 冒泡法代码实现(一)

m_list = [
    [1, 9, 8, 5, 6, 7, 4, 3, 2],
    [1, 2, 3, 4, 5, 6, 7, 8, 9],
    [9, 8, 7, 6, 5, 4, 3, 2, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 2]
]

nums = m_list[0]
length = len(nums)
print(nums)

count_swap = 0
count_iter = 0
# bubble_sort
for i in range(length):
    for j in range(length -i -1):
        count_iter += 1
        if nums[j] > nums[j + 1]:
            nums[j], nums[j + 1] = nums[j + 1], nums[j]
            count_swap +=1
print(nums, count_swap, count_iter)

4. 冒泡法代码实现(二)

  • 优化实现
    • 上边的有问题
    • 下面的正确
# 错误的代码
m_list = [
    [1, 9, 8, 5, 6, 7, 4, 3, 2],
    [1, 2, 3, 4, 5, 6, 7, 8, 9],
    [9, 8, 7, 6, 5, 4, 3, 2, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 2]
]

nums = m_list[0]
length = len(nums)
print(nums)

flag = False
count_swap = 0
count_iter = 0
# bubble_sort
for i in range(length):
    for j in range(length -i -1):
        count_iter += 1
        if nums[j] > nums[j + 1]:
            nums[j], nums[j + 1] = nums[j + 1], nums[j]
            count_swap +=1
            flag = True  # swapped
    if not flag:
        break
print(nums, count_swap, count_iter)
# 正确代码
m_list = [
    [1, 9, 8, 5, 6, 7, 4, 3, 2],
    [1, 2, 3, 4, 5, 6, 7, 8, 9],
    [9, 8, 7, 6, 5, 4, 3, 2, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1, 1, 1, 2]
]

nums = m_list[1]
length = len(nums)
print(nums)

count_swap = 0
count_iter = 0
# bubble_sort
for i in range(length):
    flag = False
    for j in range(length -i -1):
        count_iter += 1
        if nums[j] > nums[j + 1]:
            nums[j], nums[j + 1] = nums[j + 1], nums[j]
            count_swap +=1
            flag = True  # swapped
    if not flag:
        break
print(nums, count_swap, count_iter)

5. 冒泡法总结

  • 冒泡法需要数据一轮轮比较
  • 可以设定一个标记判断此轮是否有数据交换发生,如果没有发生交换,可以结束排序,如果发生交换,继续下一轮排序
  • 最差的排序情况是,初始顺序与目标顺序完全相反,遍历次数1,…,n-1之和n(n-1)/2
  • 最好的排序情况是,初始顺序与目标顺序完全相同,遍历次数n-1
  • 时间复杂度O(n2)

冒泡排序算法及其优化(Python)

#!/usr/bin/python3 # -*- coding: UTF-8 -*- import random ''' 冒泡排序算法及其优化 冒泡排序的基本特征是只能交换相邻的元素。 从下边界开始...
  • QiaoRuoZhuo
  • QiaoRuoZhuo
  • 2018-01-07 21:48:09
  • 195

用Python实现八大排序算法--冒泡排序

一、冒泡排序介绍冒泡重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。...
  • chibangyuxun
  • chibangyuxun
  • 2016-11-01 16:41:02
  • 2359

冒泡排序算法-Python描述

冒泡排序的思想:假如数列有n个数,我们从第n个数开始,比较第n个数与第n-1个数的大小,如果第n个小于第n-1个,则交换两者的位置,否则不动;依次进行下去直到数组当中的第一个元素,此时第一个元素就是整...
  • qq_14959801
  • qq_14959801
  • 2016-11-01 17:53:59
  • 2033

python实现冒泡排序法

冒泡排序算法的运作如下: 比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复...
  • ws_cs_dn
  • ws_cs_dn
  • 2014-06-30 18:38:48
  • 633

桶排序,冒泡排序,快速排序算法Python实现

桶排序案例:学生分数为0~10,要按照从小到大排序: 1. 首先我们需要申请一个大小为10的数组(python为列表),然后遍历学生成绩,每遍历一个成绩就在序号=成绩的位置+1. 2. 生成完列表...
  • horseinch
  • horseinch
  • 2016-07-20 23:11:10
  • 1705

详解冒泡排序及Python3代码实现

下面详细介绍冒泡排序的思想以及python3代码实现。 首先是这样一个常识:在水中两个相同深度的气泡,大的气泡上浮的快,最先上浮到水面。 然后假设有一个列表保存着一组数据,如下所示:左端为里表中的...
  • bbc955625132551
  • bbc955625132551
  • 2017-08-14 18:11:45
  • 353

Python练手之6种经典排序算法

在入手了python之后,确实被它简单的特性和上手容易度震惊过。不过python和c语言什么的又确实存在很大的差别,习惯了c语言,使用python的时候多少还是有些不习惯。   入手python...
  • u012377333
  • u012377333
  • 2014-10-30 20:05:14
  • 1417

小白学数据结构——四、排序算法Python(冒泡、选择、快速、插入、希尔、归并排序)

排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。 我们通常所说的排序算法往往指的是内部排序算法,...
  • qq_33414271
  • qq_33414271
  • 2017-11-14 11:37:44
  • 5166

python3实现冒泡排序和插入排序

# 普通冒泡排序 (排序:由小到大) import random list_data = [] for i in range(10): list_data.append(random.ra...
  • danfeixia
  • danfeixia
  • 2017-06-07 21:58:08
  • 500

冒泡排序的三种实现方法-----python

def bubble(l): print l for index in range(len(l) - 1, 0 , -1): for two_index in rang...
  • haoni123321
  • haoni123321
  • 2013-10-29 15:10:03
  • 11442
收藏助手
不良信息举报
您举报文章:排序算法-冒泡排序-python
举报原因:
原因补充:

(最多只允许输入30个字)