测试萌新必备算法题之:冒泡排序

Posted suanmiaoup

tags:

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

冒泡排序应该是程序员入门必备的算法之一吧,我们来看看常规的冒泡排序算法;

def bubble_sort_01(random_list):
    """没有优化的常规冒泡排序"""
    list_len = len(random_list)
    # 外层控制循环次数,内层控制索引
    for outer_idx in range(list_len - 1):
        for inner_idx in range(list_len - 1 - outer_idx):
            if random_list[inner_idx] > random_list[inner_idx + 1]:
                random_list[inner_idx], random_list[inner_idx + 1] = random_list[inner_idx + 1], random_list[inner_idx]

 

优化方法:

有时候生成的随机列表,元素排列不是那么乱,那么在n-1次之前就已经排好序了,后面的过程就多余了,浪费了时间和空间,那么有什么办法可以提前知道列表已经排好序吗?答案是当然有,我们可以在内部排序过程中添加一个标记,查看本轮循环有没有产生数据交换,如果一轮循环下来,没有发生任何的数据交换,则说明列表已经是有序的了,接下来就来实现;

def bubble_sort_02(random_list):
    """添加了结束标记的冒泡排序"""
    list_len = len(random_list)
    # 外层控制循环次数,内层控制索引
    for outer_idx in range(list_len - 1):
        # 添加一个标记
        flag = 0
        for inner_idx in range(list_len - 1 - outer_idx):
            if random_list[inner_idx] > random_list[inner_idx + 1]:
                random_list[inner_idx], random_list[inner_idx + 1] = random_list[inner_idx + 1], random_list[inner_idx]
                flag += 1
        # 每次循环后,判断flag如果为0,则说明没有发生数据交换,直接结束排序即可
        if flag == 0:
            break

 

继续优化:

第二种方法其实是优化的外层循环,它可以让外层循环提前结束,那么内层循环也会少运行很多,那内层循环的还有没有改进空间呢?答案也是有的,前面两种方法都是从前往后遍历,如果说内层再添加一个从后往前遍历的循环,那么外层的循环次数又可以减少一半,那么看看到底如何实现;

def bubble_sort_03(random_list):
    """添加了结束标记的双向冒泡排序"""
    list_len = len(random_list)
    # 外层控制循环次数,内层控制索引
    for outer_idx in range(list_len - 1):
        # 添加一个标记
        flag = 0
        for inner_idx in range(outer_idx, list_len - 1 - outer_idx):
            if random_list[inner_idx] > random_list[inner_idx + 1]:
                random_list[inner_idx], random_list[inner_idx + 1] = random_list[inner_idx + 1], random_list[inner_idx]
                flag += 1
        # 每次循环后,判断flag如果为0,则说明没有发生数据交换,直接结束排序即可
        if flag == 0:
            break
        # 添加一个逆向的排序循环
        for i in range(list_len - 2 - outer_idx, outer_idx, -1):
            if random_list[i] < random_list[i - 1]:
                random_list[i], random_list[i - 1] = random_list[i - 1], random_list[i]

 

随机生成一个长度为100的整数列表,查看这三种方法总共循环的次数,得到的结果为:

技术图片

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

每天一道算法题之冒泡排序

知识分享:程序员必备的七种常见排序算法和搜索算法

45期盘点那些必问的数据结构算法题之基础排序

手撕排序算法 - iOS进阶必备

可视化冒泡排序算法

测开面试常用算法