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