排序算法专题之冒泡排序

Posted Python算法之旅

tags:

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

说在前面

冒泡排序算法是简单算法中相对容易理解的一种算法,它的基本思想是通过比较相邻元素,将待排序区域的最值交换到左端(或右端)。

通常它要用到一个二重循环,外层循环累计排序轮数,同时控制待排序数组的右边界,即a[0..i]为待排序部分;内层循环扫描a[0..i-1],比较相邻元素,并通过交换元素值的方式将最大值冒泡到最右端。

由于外层循环变量i的含义既可以表示排序轮数,也可以表示待排序数组的边界,内层循环扫描方向既可以向左,也可以向右,所以实现基础冒泡排序的代码形式多样,可以产生很多变例。

对于一个长度为n的序列来说,冒泡排序通常需要冒泡(n-1)趟才能完成排序,但是如果某趟扫描过程中没有发生交换操作,我们就认为所有元素均已处在正确位置,可以提前结束排序。这就给冒泡排序提供了优化的空间。我们可以采用设置交换标志或记录最后一次交换位置的方式来优化冒泡排序算法。


“Python算法之旅”微信群等着你
排序算法专题之冒泡排序
排序算法专题之冒泡排序
排序算法专题之冒泡排序
排序算法专题之冒泡排序

扫码加入“Python算法之旅”微信群,和斌哥面对面交流,更多资料和更有趣的话题等你一起来分享。

排序算法专题之冒泡排序

冒泡排序算法(填空版)

1. 基础冒泡排序

例题1.使用冒泡排序算法对列表a升序排序。

函数名:bubble_sort(a)

参数表:a -- 待排序列表。

返回值:该方法没有返回值,但是会对列表的对象进行升序排序。

算法思想:外层循环累计排序轮数,同时控制待排序数组的右边界,即a[0..i]为待排序部分;内层循环扫描a[0..i-1],比较相邻元素,并通过交换元素值的方式将最大值冒泡到最右端

def bubble_sort(a):

    for i in range(len(a)-1, 0, -1): 

        for j in range(①                    ):

            if a[j] > a[j+1]:

                a[j], a[j+1] = a[j+1], a[j]


基础冒泡排序变例:外层循环变量i累计排序轮数

变例1:向右扫描,将最大值冒泡到右端

def bubble_sort_12(a):

    for i in range(1, len(a)):#变量i累计排序轮数

        for j in range(①                   ): 

            if a[j] > a[j+1]:

                a[j], a[j+1] = a[j+1], a[j]


变例2:向左扫描,将最小值冒泡到左端

def bubble_sort_13(a):

    for i in range(1, len(a)): #变量i累计排序轮数

        for j in range(①                    ):

            if a[j] < a[j-1]:

                a[j], a[j-1] = a[j-1], a[j]


2. 冒泡排序改进:设置交换操作标志

例题2.使用冒泡排序改进算法对列表a升序排序。

函数名:bubble_sort_2(a)        

参数表:a -- 待排序列表。

返回值:该方法没有返回值,但是会对列表的对象进行升序排序。

def bubble_sort_2(a):

    for i in range(len(a)-1, 0, -1):

        swapFlag = ①            

        for j in range(i):

            if a[j] > a[j+1]:

                a[j], a[j+1] = a[j+1], a[j]

                swapFlag = ②             

        if not swapFlag: ③              #无交换操作,表示已完成排序,退出循环


3. 冒泡排序改进:更新右边界,减少扫描范围

例题3.使用冒泡排序改进算法对列表a升序排序。

函数名:bubble_sort_3(a)      

参数表:a -- 待排序列表。

返回值:该方法没有返回值,但是会对列表的对象进行升序排序。

def bubble_sort_3(a):

    left, right = 0, len(a)-1

    while left < right:

        swapPos = left 

        for j in range(left,right): #顺序扫描

            if a[j] > a[j+1]:

                a[j], a[j+1] = a[j+1], a[j]

                swapPos = ①         

        right = ②            #修改待排序数组右边界


4. 冒泡排序改进:双向冒泡(鸡尾酒排序)

例题4.使用冒泡排序改进算法对列表a升序排序。

函数名:bubble_sort_4(a)      

参数表:a -- 待排序列表。

返回值:该方法没有返回值,但是会对列表的对象进行升序排序。

def bubble_sort_4(a):

    left, right = 0, len(a)-1

    while left < right:

        swapPos = left #先假设最后一次发生交换操作的位置为left

        for j in range(left,right): #顺序扫描a[left..right-1]

            if a[j] > a[j+1]:

                a[j], a[j+1] = a[j+1], a[j]

                swapPos = ①         

        right = ②            #修改待排序数组右边界



冒泡排序算法(完整版)

1. 基础冒泡排序

例题1.使用冒泡排序算法对列表a升序排序。

函数名:bubble_sort(a)

参数表:a -- 待排序列表。

返回值:该方法没有返回值,但是会对列表的对象进行升序排序。

算法思想:外层循环累计排序轮数,同时控制待排序数组的右边界,即a[0..i]为待排序部分;内层循环扫描a[0..i-1],比较相邻元素,并通过交换元素值的方式将最大值冒泡到最右端

def bubble_sort(a):

    for i in range(len(a)-1, 0, -1):

        for j in range(i):

            if a[j] > a[j+1]:

                a[j], a[j+1] = a[j+1], a[j]


基础冒泡排序变例:外层循环变量i累计排序轮数

变例1:向右扫描,将最大值冒泡到右端

def bubble_sort_12(a):

    for i in range(1, len(a)):

        for j in range(len(a)-i):

            if a[j] > a[j+1]:

                a[j], a[j+1] = a[j+1], a[j]


变例2:向左扫描,将最小值冒泡到左端

def bubble_sort_13(a):

    for i in range(1, len(a)):

        for j in range(len(a)-1, i-1, -1):

            if a[j] < a[j-1]:

                a[j], a[j-1] = a[j-1], a[j]


2. 冒泡排序改进:设置交换操作标志

例题2.使用冒泡排序改进算法对列表a升序排序。

函数名:bubble_sort_2(a)

参数表:a -- 待排序列表。

返回值:该方法没有返回值,但是会对列表的对象进行升序排序。

def bubble_sort_2(a):

    for i in range(len(a)-1, 0, -1):

        swapFlag = False 

        for j in range(i):

            if a[j] > a[j+1]:

                a[j], a[j+1] = a[j+1], a[j]

                swapFlag = True  

        if not swapFlag: break #无交换操作,表示已完成排序,退出循环


3. 冒泡排序改进:更新右边界,减少扫描范围

例题3.使用冒泡排序改进算法对列表a升序排序。

函数名:bubble_sort_3(a)

参数表:a -- 待排序列表。

返回值:该方法没有返回值,但是会对列表的对象进行升序排序。

def bubble_sort_3(a):

    left, right = 0, len(a)-1

    while left < right:

        swapPos = left 

        for j in range(left,right): 

            if a[j] > a[j+1]:

                a[j], a[j+1] = a[j+1], a[j]

                swapPos = j

        right = swapPos #修改待排序数组的右边界


4. 冒泡排序改进:双向冒泡(鸡尾酒排序)

例题4.使用冒泡排序改进算法对列表a升序排序。

函数名:bubble_sort_4(a)

参数表:a -- 待排序列表。

返回值:该方法没有返回值,但是会对列表的对象进行升序排序。

def bubble_sort_4(a):

    left, right = 0, len(a)-1

    while left < right:

        swapPos = left #先假设最后一次发生交换操作的位置为left

        for j in range(left,right): #顺序扫描a[left..right-1]

            if a[j] > a[j+1]:

                a[j], a[j+1] = a[j+1], a[j]

                swapPos = j

        right = swapPos #修改待排序数组的右边界

        for j in range(right,left,-1): #逆序扫描a[left+1..right]

            if a[j] < a[j-1]:

                a[j],a[j-1] = a[j-1],a[j]

                swapPos = j

        left = swapPos #修改待排序数组的左边界

写在后面

Python排序算法系列文章是我在阅读了大量算法专著以后,尝试用浅陋的语言把自己的理解表达出来。由于本人水平有限,表述中难免出现疏漏甚至错误之处,敬请谅解。

无论是赞同还是反对我的看法,都请你给我留言。如果你有新的想法,千万不要憋在心里,请发出来大家一起讨论。让我们相互学习,共同进步!


需要本文word版的,可以加入“选考VB算法解析”知识星球参与讨论和下载文件,“选考VB算法解析”知识星球汇集了数量众多的同好,更多有趣的话题在这里讨论,更多有用的资料在这里分享。

我们专注选考VB算法,感兴趣就一起来!



相关优秀文章:


以上是关于排序算法专题之冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

排序算法专题之选择排序

排序算法专题之希尔排序

算法排序专题:冒泡排序

清新!冒泡排序算法|获奖微课算法专题13-3(公益下载交流)

排序专题-插入排序

冒泡排序算法导学案