冒泡排序算法代码(使用Python实现)

问题描述

记得刚刚接触算法的时候觉得特别难以理解.最初接触的是冒泡排序 🤣 但是现在看一遍马上知道怎么回事,以及想到如何代码实现.

就像是咕噜咕噜冒泡泡一样.每次都是最大的泡泡冒到最上面.查看动画是最好理解的算法的方式之一.请参看:冒泡排序动画演示

关于冒泡排序的特性:冒泡排序的对比时间复杂度是O(n^2) 交换时间复杂度是O(n^2).最优的排序算法时间比较复杂度为O(logn)

冒泡排序的适应性相对来说比较广泛.链式结构也可以使用.冒泡排序的优势是无需任何额外的储存开销.选择排序从排序思维上来说,则是冒泡排序的性能优化版本

思路

冒泡排序的算法思路在于对无序表进行多趟比较交换,

每趟包括了多次两两相邻比较,并将逆序的数据项互换位置,最终能将本趟的最大项就位

一共需要n-1趟比较交换,实现整表排序

可以形象的理解为:水底的泡泡需要往上面冒.最大的泡泡先冒出去.冒出去的时候要和他的每个小弟打招呼,换换位置.好离水面最近.

比对的时间复杂度是O(n2),关于交换次数,时间复杂度也是O(n2).此外关于优化版本的冒泡排序的时间复杂度最佳可以是O(n).这种情况是在需要进行排序的表本身已经是有序表的情况下.本身已经不需要排序了.

但是经过实际测试:循环次数可以降低,但是由于需要赋值与判断操作,排序需要的实际时间反而增加了.(测试数据有十万个)




动画

冒泡排序

def bubbleSort(alist):

    for pass_num in range(len(alist)-1,0,-1): # 比对次数
        for i in range(pass_num):
            if alist[i+1] <  alist[i]:
                alist[i],alist[i+1] = alist[i+1] ,alist[i]
    return alist

print(bubbleSort([21,312,321,321,54,654,423,12,32,312]))




优化版本

优化的内容具体体现在 : 如果发现一轮比较当中,没有发生元素之间相互交换,则是意味着元素已经排序完毕.可以终止掉后面的排序循环.使用exchangs进行监控


def bubbleSort_II(alist): # 性能改进
    exchanges = True #进行监控的变量
    pass_num = len(alist) - 1
    while pass_num >0 and exchanges:
        exchanges = False
        for i in range(pass_num):
            if alist[i+1] <  alist[i]:
                exchanges = True
                alist[i],alist[i+1] = alist[i+1] ,alist[i]
        pass_num = pass_num -1
    return alist

print(bubbleSort([21,312,321,321,54,654,423,12,32,312]))




参考

posted @ 2020-03-17 21:38  高坦的博客  阅读(1150)  评论(1编辑  收藏  举报