• 冒泡排序


    冒泡排序

    描述:

    1. 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
    2. 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名“冒泡排序”。

    原理:

    1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

    2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

    3. 针对所有的元素重复以上的步骤,除了最后一个。

    4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

    标准版:

    def bubble_sort(li):
        n = len(li)
        for i in range(n - 1):
            judge = True
            for j in range(0, n - 1 - i):
                if li[j] > li[j + 1]:
                    li[j], li[j + 1] = li[j + 1], li[j]
                    judge = False
            if judge:
                break
        return li
    
    

    注释版:

    def bubble_sort(li):
        n = len(li)
        # n为列表的长度
        for i in range(n - 1):
            # 外层循环控制内层循环执行的次数, i为第几趟
            # for i in range(n - 1): 等价于 for i in range(len(li) - 1)
            # 后者属于未优化状态, 因为每执行一次循环都需要计算一下列表的长度
            judge = True
            for j in range(0, n - 1 - i):
                # 内层循环执行一次, 选出当前数组中最大的一个值
                # n - 1 - j 注: 执行一次循环后, 选出最大的值, 下次比较就不用再比较它了
                if li[j] > li[j + 1]:
                    # 如果前者大于后者, 交换位置
                    li[j], li[j + 1] = li[j + 1], li[j]
                    judge = False
            if judge:
                break
            # 布尔值的优化, 如果序列已经排好序, 不会进入if判断语句,  直接跳出循环结束函数
        return li
        # 将冒号后的列表, 返回
    
    if __name__ == "__main__":
        l = list(i for i in range(0, 10000))
        print("洗牌之前的列表:" + str(l))
        random.shuffle(l)
        # shuffle()函数是random模块内的一个洗牌函数, 顾名思义: 将有序的列表的顺序打乱
        print("洗牌之后的列表:" + str(l))
        print("冒泡之后的列表:" + str(bubble_sort(l)))
    

    时间复杂度:

    最好情况O(n):

    文件的初始状态是正序的,一趟扫描即可完成排序。
    所需的关键字比较次数和记录交换次数均达到最小值
    所以,冒泡排序最好的[时间复杂度]为O(n)

    最坏情况O(n^2):

    若初始文件是反序的,需要进行n趟排序。
    每趟排序要进行n-1次关键字的比较,且每次比较都需要交换记录位置。
    在这种情况下,比较和交换次数均达到最大值:
    冒泡排序的最坏时间复杂度为O(n^2) n^2的意思是n的2次方

    平均时间复杂度O(n^2):

    平均时间复杂度一般都为最坏时间复杂度.
    因为算法也是为了解决问题而产生的, 要完美的解决问题, 必须考虑到最坏情况, 并给出解决方案

    稳定性:

    冒泡算法的原理就是从左向右相邻的元素两两对比,如果前者大于后者,则进行交换。如果两个元素相等,是不会交换其位置的,因此冒泡排序是稳定的。

    注:如果将交换条件改为“list[i]>=list[i+1]”就不是稳定的了。

  • 相关阅读:
    解决浏览器跨域限制方案之WebSocket
    解决浏览器跨域限制方案之CORS
    解决浏览器跨域限制方案之JSONP
    浏览器跨域限制概述
    tomcat cluster配置实战注意事项
    学习go语言编程系列之定义变量
    修改xshell的默认字间距和行间距
    学习go语言编程系列之helloworld
    hive操作语句使用详解
    Hive通过查询语句向表中插入数据注意事项
  • 原文地址:https://www.cnblogs.com/amou/p/8991629.html
Copyright © 2020-2023  润新知