冒泡排序

冒泡排序

排序思路:

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

时间复杂度为:

  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

 

posted @ 2017-03-08 17:59  yxy_linux  阅读(772)  评论(0编辑  收藏  举报