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

啥是冒泡排序

就是一组无序数组排序,先用从一个数开始依次与后面的数比较满足条件换位,直到所有的数都比较了一遍之后,数组变为一个有序数组。
放一个不知道在哪盗的图:
初学算法(二):冒泡排序及其优化_第1张图片
这个图就展现了一个完整的冒泡排序的过程。

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

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 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]

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

你可能感兴趣的:(算法)