Python排序算法之冒泡排序

简介

比较列表相邻的两个值,如果前面比后面大,则交换这两个值。
每一趟冒泡排序,无序区减少一个数,有序区增加一个数。

时间复杂度

最坏情况: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)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值