原理:比较两个相邻的元素,将值大的元素交换至右端。
思路:依次比较相邻的两个数,将小数放在前面,大数放在后面。即在第一趟:首先比较第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)
在某次对比之后,发现顺序没有改变,就证明已经排好序了。 其实快不了多少,因为上述情况发生的概率比较小