1. 简介
1.1 概念
冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
1.2 步骤
冒泡排序算法的运作如下:
- 比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
1.3 分析
- 最优时间复杂度:O(n) (表示遍历一次发现没有任何可以交换的元素,排序结束。)
- 最坏时间复杂度:O(n2)
- 稳定性:稳定
1.4 优化
-
添加 flag 参数
-
记录上次交换的位置
-
鸡尾酒排序
- 鸡尾酒排序,也叫定向冒泡排序,是冒泡排序的一种改进。此算法与冒泡排序的不同之处在于从低到高排然后从高到低,而冒泡排序则仅从低到高去比较序列中的每个元素,可以得到比冒泡排序稍微好一点的效能。
- 最差时间复杂度O(n^2)
- 最优时间复杂度-如果序列在一开始已经大部分排列过的话,会接近o(n)
- 平均复杂度-O(n^2)
2. 代码实例
def sort(a):
for i in range(len(a)-1, 0, -1):
for j in range(i):
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
# 优化1: 添加标记flag, 如果内循环中的判断没有执行,表示已经数组是排序好的,直接退出循环即可
def sort_better1(a):
for i in range(len(a)-1, 0, -1):
print("i------" + str(i))
flag = True #如果下面的循环中的判断没有执行,表示已经数组是排序好的,直接退出循环即可
for j in range(i):
print("j------" + str(j))
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
flag = False
print(a)
if flag:
break
# 优化2:记录上次最后一次交换元素的位置,那么次位置之后的就是已经排序好的,下次遍历的时候就不需要再遍历此位置之后的元素
def sort_better2(a):
last_position = len(a) - 1
for i in range(len(a)-1, 0, -1):
print("i------" + str(i))
flag = True
index = 0
for j in range(last_position):
print("j------" + str(j))
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
flag = False
index = j
print(a)
if flag:
break
last_position = index
# 优化3: 鸡尾酒排序 鸡尾酒排序,即双向的冒泡排序,等于是冒泡排序的轻微变形。不同的地方在于从低到高然后从高到低
#(有先后顺序,并非同时;大循环下第一个循环是从开始扫到结束,将最大的归到最后;第二个循环是从倒数第二个位置往开始端扫,将最小的归到开始的位置)
def sort_better3(a):
last_position = len(a) - 1
for i in range(len(a)-1, 0, -1):
print("i------" + str(i))
flag = True
index = 0
for j in range(last_position):
print("j------" + str(j))
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
flag = False
index = j
last_position = index
for k in range(last_position, 0, -1):
print("k------" + str(k))
if a[k] < a[k-1]:
a[k], a[k-1] = a[k-1], a[k]
flag = False
print(a)
if flag:
break
li = [2, 7, 3, 1, 5, 4, 8, 9, 10]
sort(li)
print(li)
a = [2, 7, 3, 1, 5, 4, 8, 9, 10]
#sort_better1(a)
#print(a)
b = [2, 7, 3, 1, 5, 4, 8, 9, 10]
sort_better2(b)
print(b)
c = [2, 7, 3, 1, 5, 4, 8, 9, 10]
#sort_better3(c)
#print(c)