测试萌新必备算法题之:冒泡排序
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的整数列表,查看这三种方法总共循环的次数,得到的结果为:
以上是关于测试萌新必备算法题之:冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章