zoukankan      html  css  js  c++  java
  • 冒泡排序

    冒泡排序

    排序思路:

      将列表每两个相邻的数对比,如果前边的比后边的大,那么交换这两个数直到将最大的数放至最右侧。

    时间复杂度为:

      O(n2)

    import random
    import time
    
    def cal_time(func):
        """
        测试时间装饰器
        :param func: 接收一个函数
        :return:
        """
        def wrapper(*args, **kwargs):
            ti = time.time()
            x = func(*args, **kwargs)
            ti2 = time.time()
            print("time cost:", func.__name__, ti2 - ti)
            return x
        return wrapper
    
    @cal_time
    def bubble_sort(li):
        """
        冒泡排序
        :param li: 列表
        :return:
        """
        for i in range(len(li) - 1):
            for j in range(len(li) - i - 1):
                if li[j] > li[j + 1]:
                    li[j], li[j+1] = li[j+1], li[j]
    
    
    data = list(range(999, 1500))
    # 将顺序打乱
    random.shuffle(data)
    print(data)
    # [944, 664, 701, 110, 482, 968, 108, 465, 246, 902, 216, 171, 361, 734, 242, 138, 914, 620, 923, 393,]
    bubble_sort(data)
    print(data)
    -------------------------------------执行结果---------------------------------------
    # time cost: bubble_sort 0.04400277137756348
    # [999, 1000, 1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010, 1011, 1012, 1013, 1014, 1015,]

     冒泡排序之优化

      优化说明:如果冒泡排序中执行一趟而没有交换,则列表已经是有序状态,可以直接结束算法。

    @cal_time
    def bubble_sort_1(li):
        """
        冒泡排序之优化
        :param li: 列表
        :return:None
        """
        for i in range(len(li) - 1):
            change = False
            for j in range(len(li) - i - 1):
                if li[j] > li[j + 1]:
                    li[j], li[j+1] = li[j+1], li[j]
                    change = True
                if not change:
                    break
    
    data = list(range(10000))
    random.shuffle(data)
    bubble_sort_1(data)
    bubble_sort(data)
    
    -------------------------------执行结果时间差-----------------------
    time cost: bubble_sort_1 0.011000633239746094
    time cost: bubble_sort 19.759130239486694
  • 相关阅读:
    windows下运行命令行mysql,提示mysql不是内部命令,解决办法
    XML和HTML的区别
    BZOJ4695 最假女选手(势能线段树)
    BZOJ5312 冒险(势能线段树)
    洛谷P3959 宝藏(NOIP2017)(状压DP,子集DP)
    区间子集最大/最小异或和问题(线性基,树上差分)
    线性基模板(线性基)
    分数模板(C++模板)
    洛谷P2516 [HAOI2010]最长公共子序列(LCS,最短路)
    组合数学知识要点
  • 原文地址:https://www.cnblogs.com/yxy-linux/p/6520609.html
Copyright © 2011-2022 走看看