初学算法(二):冒泡排序及其优化

啥是冒泡排序

就是一组无序数组排序,先用从一个数开始依次与后面的数比较满足条件换位,直到所有的数都比较了一遍之后,数组变为一个有序数组。
放一个不知道在哪盗的图:
在这里插入图片描述
这个图就展现了一个完整的冒泡排序的过程。

算法一:基本冒泡排序(第一版)

def bubbleSort0(nums):
    #第一层循环确定循环次数,最后一个数不需要参与循环所以要用长度-1
    for i in range(len(nums)-1):
        #第二层循环依次比较大小,确定好的不用比较所以-i
        for j in range(len(nums)-i-1):
            if nums[j] < nums[j+1]:
                nums[j],nums[j+1]=nums[j+1],nums[j]
    return nums

那么基本的冒泡排序有什么问题呢,举个例子,比如说现在有一个数组是[1,6,5,4,3,2],那么经过一次排序之后数组变成了[6,5,4,3,2,1],这时候数组已经是有序的了,但是计算机不知道,它还会继续把所有循环全部做完,这样就浪费了很多的时间,所以我们可以设置一个标识,用来表示是否进行了换位,如果没有换位那就是表示数组已经有序了,直接停止循环。

算法二:进化冒泡排序(添加标识符)

def bubbleSort1(nums):
    for i in range(len(nums)-1):
        flag = False   #假设没有做交换,此时应该退出循环
        for j in range(len(nums)-i-1):
            if nums[j] < nums[j+1]:
                nums[j],nums[j+1]=nums[j+1],nums[j]
                flag = True #做了交换标识符为True,继续与下一个比较
        if not flag:  #没有做交换则break
            break
    return nums

这个进化版的冒泡排序我做了一个简单的标识,这样可以在数组有序后立刻停止循环。

算法三:超进化冒泡排序(双向冒泡)

def bubbleSort2(nums):
    low,high = 0,len(nums)-1 #因为要从前后双向排序,所以设定前后边界
    while low<high:  #前边界小于后边界说明还需要继续排序
        flag = low   #flag最后一次发生交换的位置
        # print(flag)
        for j in range(low,high):  #正向扫描,与基本泡泡一样
            if nums[j] < nums[j+1]:
                nums[j],nums[j+1]=nums[j+1],nums[j]
                flag = j  #记录下最后发生交换的位置
                # print(flag)
        high = flag
        # print(flag)
        # print(high)
        # print(low)
        for j in range(high,low,-1):  #逆向扫描,与基本泡泡一样
            if nums[j] > nums[j-1]:
                nums[j], nums[j-1] = nums[j-1], nums[j]
                flag = j
        low = flag
        # print(low)
    return nums

双向排序的核心思想就是利用不断变化的前后边界来缩小未排序的数组大小。

算法四:基本冒泡排序第二版

def bubbleSort3(nums):
    for i in range(len(nums)-1):
        for j in range(i+1,len(nums)-1):   #从未排序数组的第一个数开始比较
            if nums[i]<nums[j]:
                nums[i], nums[j] = nums[j], nums[i]
    return nums

大家可以看到这个方法是每次都把未排序的第一个数与后面的比较,然后放在排序好的队列的最后面,不算是优化但是个人感觉这个比第一版更好理解。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值