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

来源:互联网 发布:c语言 void main 编辑:程序博客网 时间:2024/05/17 22:23

下面详细介绍冒泡排序的思想以及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)#排序后


原创粉丝点击