Python | 有趣的冒泡排序

Posted 算法与编程之美

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python | 有趣的冒泡排序相关的知识,希望对你有一定的参考价值。

本文首发于微信公众号:"算法与编程之美",欢迎关注,及时了解更多此系列文章。

引言

喝汽水的时候,汽水中常常有许多小小的气泡,哗啦哗啦飘到上面来。这是因为组成小气泡的二氧化碳比水要轻,所以小气泡可以一点一点向上浮动。而我们的冒泡排序之所以叫做冒泡排序,正是因为这种排序算法的每一个元素都可以像小气泡一样,根据自身大小,一点一点向着数组的一侧移动。

解决方案

冒泡排序逻辑比较简单,易于理解。

步骤大致如下:对存放原始数据的数组,按从前往后的方向进行多次扫描,每次扫描称为一趟。当发现相邻两个数据的次序与排序要求的大小次序不符合时,即将这两个数据进行互换。如果从小到大排序,这时,较小的数据就会逐个向前移动,好像气泡向上漂浮一样。生活中,我们在集体活动中站队时,第一次站队由于没有固定的位置,往往是大家先随便站成一排,然后再通过换位置的方式逐步形成高矮顺序,这就体现了冒泡排序的思想

下面用画图来表示一下该过程:

 

通过观察我们不难发现,第一轮比较了4次,第二轮比较了3次,第三轮比较了2次,第四轮比较了1次。为什么每一轮相互比较的次数都减少了一次?因为在第一轮比较结束的时候,这一组数据中最大的数23已经下沉到最底,之后的每一轮比较的时候都不用再去比较23;第二轮比较结束的时候,次大的12也沉到了倒数第二的位置,跟23一样,在之后的每一轮比较中就不用再去比较12了。第三轮结束和第四轮结束的情况也是类似。

由此我们可以发现冒泡排序的特点:冒泡排序把N个数通过N-1轮排序,升序排序时每一轮比较会把最大的数下沉到最底(降序排序则反之),所以相互比较的次数每一轮都会比前一轮少一次。

下面我们用Python代码实现该算法:

List = []

lenth = len(List)

for i in range(0,lenth):

    for j in range(i+1,lenth):

        if List[j] < List[i]:

            List[i] , List[j] = List[j] , List[i] #升序用>,降序用<

return List

实际使用该算法时我们会发现这样一个问题:由于每次比较没有记录,即使是一个完全有序的含有N个数的序列,程序也会运行N-1次。

为了改善这种情况,我们可以通过标记flag来优化排序,当在双重循环还未循环完毕的时候,如果已经完成了排序,则通过标记flag达到结束的效果。

代码如下:

List = []

lenth = len(List)

for i in range(0,lenth):

    flag = 0

    for j in range(i+1,lenth):

        if List[j] < List[i]:

            List[i] , List[j] = List[j] , List[i] #升序用>,降序用<

            flag += 1

    if flag == 0:

        break

结语

本文简单介绍了一下冒泡排序的原理及优化方法。虽然该算法效率不高,但是每个算法都有合适的应用场景。

实习编辑:李欣容

稿件来源:深度学习与文旅应用实验室(DLETA)

以上是关于Python | 有趣的冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

有趣的算法 | 冒泡排序

排序算法突击(Java):冒泡排序

科活中心有趣的算法——选择排序插入排序

php实现冒泡排序算法

漫画:什么是冒泡排序?

python写冒泡排序