原理:比较两个相邻的元素,将值大的元素交换至右端。

思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复第一趟步骤,直至全部排序完成。

循环和递归方式(要注意递归深度问题):

import random
import time
import copy


def mytime(func):
    def inner(*args, **kwargs):
        t1 = time.time()
        func(*args, **kwargs)
        t2 = time.time()
        print('time costed is {}.'.format(t2-t1))
    return inner

@mytime
def bubble_sort(li):
    print(li)
    for j in range(len(li)-1):
        for i in range(len(li)-j-1):
            if li[i] >= li[i+1]:
                li[i], li[i+1] = li[i+1], li[i]
    print(li)


@mytime
def bubble_sort2(li):
    def core(subscript):
        for i in range(subscript):
            if li[i] >= li[i + 1]:
                li[i], li[i + 1] = li[i + 1], li[i]
        subscript -= 1
        if subscript > 1:
            return core(subscript)
    length = len(li) - 1
    print(li)
    core(length)
    print(li)


li = list(range(800))
random.shuffle(li)
nli = copy.deepcopy(li)
bubble_sort(li)
bubble_sort2(nli)

  

  

冒泡排序优化:

import random
import time
import copy


def mytime(func):
    def inner(*args, **kwargs):
        t1 = time.time()
        func(*args, **kwargs)
        t2 = time.time()
        print('time costed is {}.'.format(t2-t1))
    return inner


@mytime
def bubble_sort3(li):
    print(li)
    for i in range(len(li) - 1):
        extr = 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]
                extr = True
        if not extr:
            return
    print(li)

li = list(range(800))
random.shuffle(li)
bubble_sort3(li)

  

  在某次对比之后,发现顺序没有改变,就证明已经排好序了。   其实快不了多少,因为上述情况发生的概率比较小