简介
比较列表相邻的两个值,如果前面比后面大,则交换这两个值。
每一趟冒泡排序,无序区减少一个数,有序区增加一个数。
时间复杂度
最坏情况:O( n 2 n^2 n2)
平均情况:O( n 2 n^2 n2)
最好情况:O(n)
空间复杂度
O(1)
稳定性
稳定
复杂性
简单
关键点
趟数:n - 1
无序区范围:0 ~ n - 趟数 - 1
优化
在一趟冒泡排序完成后,如果没有发生任何的交换,
则认为列表已经是有序的,可以直接结束算法。
代码示例
#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""冒泡排序
比较列表每相邻的两个数,如果前面比后面大,则交换这两个数。
一趟排序完成后,无序区减少一个数,有序区增加一个数。
时间复杂度:O(n^2)
关键点:趟(n - 1);无序区范围(n - 趟数 - 1)
优化:
在冒泡排序的一趟排序完成后,如果没有发生任何的交换,
则认为列表已经是有序的,可以直接结束算法。
"""
import random
def bubble_sort(ls, reverse=False):
"""冒泡排序
Args:
:param ls: list, 待排序的列表
:param reverse: bool, 升序还是降序,默认升序
"""
length = len(ls)
# 决定是升序还是降序
# symbol = {'gt': '>', 'lt': '<'}
# default_symbol = symbol['gt']
# if reverse:
# default_symbol = symbol['lt']
# con_tpl = f'ls[j] {default_symbol} ls[j + 1]'
for i in range(length - 1): # 趟数
exchange = False # 标志位,是否进行了交换
for j in range(length - i - 1): # 无序区范围
# if eval(con_tpl):
if ls[j] > ls[j + 1]:
ls[j], ls[j + 1] = ls[j + 1], ls[j]
exchange = True # 进行了交换
if not exchange:
return
ls = [random.randint(0, 100) for _ in range(10)]
print(ls)
bubble_sort(ls, reverse=True)
print(ls)