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(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)):#变量i累计排序轮数

        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]

 

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

例题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 #无交换操作,表示已完成排序,退出循环

 

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

例题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 #修改待排序数组的右边界

 

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

例题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 #修改待排序数组的左边界

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值