• 冒泡排序(Bubble Sort)


    冒泡排序(Bubble Sort)

    一、基本思想

    冒泡排序是所有排序算法中最简单的一个。它是一种基于比较排序的算法,这个算法主要的排序思想就是比较每一对相邻的元素,如果它们的顺序不对,就交换它们,最终所有元素达到有序的状态。

    二、实现逻辑

    首先有一个数组,里面存放着待排序的元素。若需要把比较大的元素排到后面,把小的元素排到前面,那么需要从头到尾开始下面的比较操作:

    1. 从头部开始比较相邻的两个元素,如果头部的元素比后面的大,就交换两个元素的位置;
    2. 往后对每个相邻的元素都做这样的比较、交换操作,这样到数组尾部时,第一个元素会成为最小的元素;
    3. 除已排好序的元素之外的,重新从头部开始第1、2步的操作;
    4. 继续对越来越少的数据进行比较、交换操作,直到没有可比较的数据为止,排序完成。

    外循环遍历,内循环比较元素

    三、时间复杂度的分析

    最坏情况下,序列是逆序的,需要比较的次数为 n ( n − 1 ) / 2 n(n-1)/2 n(n1)/2 n n n 个数据元素最多存在 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n1) 对逆序),则对应的时间复杂度是: O ( n 2 ) O(n^2) O(n2)

    最优情况下,序列已经排好序,只需要比较 n − 1 n-1 n1 次即可退出外循环,即时间复杂度为 Ω ( n 2 ) \Omega(n^2) Ω(n2)

    对于 n n n 个元素来说共有 n ! n! n! 种不同的序列,平均下来每个序列要存在 n ( n − 1 ) 4 \frac{n(n-1)}{4} 4n(n1) 对逆序,所以冒泡排序平均时间复杂度是 Θ ( n 2 ) \Theta(n^2) Θ(n2)

    四、空间时间复杂度的分析

    由于比较交换元素并不开辟额外的内存的空间,故有空间复杂度为: O ( 1 ) O(1) O(1)

    五、算法实现

    普通版本

    def bubble_sort(array: list, reverse: bool=False) -> None:
        '''
        array: 支持数值型数据,如整型与浮点型混合;支持全为字符串类型的数据;不支持字符串型与数值型混合。
        reverse: 是否降序, 默认采用升序。
        '''
        for i in range(len(array) - 1): # loop to access each array element
            for j in range(len(array) - i - 1): # loop to compare array elements
            # compare two adjacent elements and change > to < to sort in descending order
                if (array[j] < array[j + 1] if reverse else array[j] > array[j + 1]):
                    # swapping elements if elements are not in the intended order
                    array[j], array[j + 1] = array[j + 1], array[j]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    添加"旗帜"

    def bubble_sort(array: list, reverse: bool=False) -> None:
        '''
        array: 支持数值型数据,如整型与浮点型混合;支持全为字符串类型的数据;不支持字符串型与数值型混合。
        reverse: 是否降序, 默认采用升序。
        '''
        for i in range(len(array) - 1):
            flag = False # 旗帜
            for j in range(len(array) - i - 1):
                if (array[j] < array[j + 1] if reverse else array[j] > array[j + 1]):
                    array[j], array[j + 1] = array[j + 1], array[j]
                    flag = True
            if not flag:
                break
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    双向排序

    def bubble_sort(array: list, reverse: bool=False) -> None:
        '''
        array: 支持数值型数据,如整型与浮点型混合;支持全为字符串类型的数据;不支持字符串型与数值型混合。
        reverse: 是否降序, 默认采用升序。
        '''
        for i in range(len(array) - 1):
            flag = False
            for j in range(len(array) - i - 1):
                if (array[j] < array[j + 1] if reverse else array[j] > array[j + 1]):
                    array[j], array[j + 1] = array[j + 1], array[j]
                    flag = True
            if flag: # 反向排序
                flag = False
                for j in range(len(array) - i - 2, 0, -1):
                    if (array[j - 1] < array[j] if reverse else array[j - 1] > array[j]):
                        array[j], array[j - 1] = array[j - 1], array[j]
                        flag = True
            if not flag:
                break
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
  • 相关阅读:
    Linux安装 vmware workstation
    VMWare虚拟机 centos时间与本地时间不一致的问题
    “2023知识产权试点单位” 坤驰科技成功入选
    基于布朗运动的文本生成方法-LANGUAGE MODELING VIA STOCHASTIC PROCESSES
    python【判断奇偶数】
    Web前端:Angular有哪些特征?什么时候使用Angular?
    C语言源代码系列-管理系统之家庭财务小管家
    Jetpack:019-Jetpack的导航二(传递数据)
    PGL图学习之基于UniMP算法的论文引用网络节点分类任务[系列九]
    【仿牛客网笔记】项目进阶,构建安全高效的企业服务——Spring Security
  • 原文地址:https://blog.csdn.net/linjing_zyq/article/details/126143409