码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-01-20 14:46:17      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:flag   image   冒泡排序   结束   src   两种   没有   员入   break   

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

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的整数列表,查看这三种方法总共循环的次数,得到的结果为:

技术图片

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

标签:flag   image   冒泡排序   结束   src   两种   没有   员入   break   

原文地址:https://www.cnblogs.com/suanmiaoup/p/12188330.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!