• 冒泡排序


    冒泡排序

    排序思路:

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

    时间复杂度为:

      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
  • 相关阅读:
    套用JQuery EasyUI列表显示数据、分页、查询
    Linux 进程间通信 信号
    Linux socket编程
    Linux字符设备驱动注册流程
    Linux杂项设备与字符设备
    Linux并发控制解决竞态的一种操作>原子操作
    Linux 进程间通信 管道通信
    Linux串口编程
    博客开通啦!
    实现Windows Phone 8多媒体:视频
  • 原文地址:https://www.cnblogs.com/yxy-linux/p/6520609.html
Copyright © 2020-2023  润新知