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

35 篇文章 0 订阅
21 篇文章 0 订阅

下面详细介绍冒泡排序的思想以及python3代码实现。

首先是这样一个常识:在水中两个相同深度的气泡,大的气泡上浮的快,最先上浮到水面。

然后假设有一个列表保存着一组数据,如下所示:左端为里表中的元素,右端为索引。


为什么要竖着放,这样可以给你‘冒泡’的感觉。当然我们很容易看出来8是最大的会最先浮出水面,但是计算机不会想我们这样‘看’。它只会一步步来,首先假设第一个数(索引为0的数为最大的会先浮出水面),然后与相邻的数(索引比它大的)比较。这里发现8>2,所以更正假设:这时候认为8是会最先浮出水面的,然后与相邻的交大索引的数比较,发现4<8,也就是说上面的4应该会晚于8浮出水面,这时候就需要交换位置,从上到下是7,3,8,4,2。这时候计算机仍然认为8是上浮最快的,然后依次与4和2比较,并且交换位置,交换完后从上到下的顺序为8,7,3,4,2. 这时候计算机找到了最大的那个气泡8.并认为最先浮出水面(然后只需要比较剩下的气泡谁先浮出水面即可)。然后计算机再从索引0开始,直到n-2(最大的已经浮出水面)。n个元素的列表一共需要从索引0开始循环n-1次(每次选出剩余气泡中最大的,最后一个不需要再比较),每次循环需要比较的次数是n-1-i(i为大循环次数)。这里有一点可以优化的地方:就是一次循环下来发现一次交换也没有,说明剩下的气泡已经按顺序排列了,就不需要再循环了。详细代码如下:

__author__ = "Allen Liu"
__time__ = "2017/8/13"
'''This program used to '''
import random
# 定义冒泡排序函数
def bubble_sort(data):
    for i in range(len(data) - 1):# 外循环每一次使得有序的数增加一个
        indicator = False # 用于优化(没有交换时表示已经有序,结束循环)
        for j in range(len(data) - 1 - i):#内循环每次讲无序部分中的最大值放到最上面
            if data[j] > data[j + 1]:
                data[j], data[j+1] = data[j+1], data[j]
                indicator = True
        if not indicator:#如果没有交换说明列表已经有序,结束循环
            break
# 验证算法正确性
data = list(range(10))#产生一个有序列表
random.shuffle(data) # 调用shuffle函数打乱顺序
print(data)# 排序前
bubble_sort(data)# 调用冒泡排序算法
print(data)#排序后


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值