算法原理
类似与我们小时候老师给我们排身高的过程,原理图如下:
时间复杂度
最坏时间复杂度为O(n^2),最优时间复杂度为O(n)。
算法步骤
- 比较相邻的元素,如果第一个数值比第二个大,就交换两个元素的位置。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完之后,最后的元素会是最大的数。
- 从头开始重复执行上述的两步,每一次排序得到的最后的大元素不再参与排序。
- 直到没有元素需要交换位置时,算法执行结束。
算法实现
def bubble_sort(alist):
"""冒泡排序"""
n = len(alist)
for i in range(1,n):
for j in range(n-i):
if alist[j]>alist[j+1]:
alist[j], alist[j+1] = alist[j+1],alist[j]
return alist
对于一个[1,2,3,4,5,6]已经排好序的列表,通过上面的程序时间复杂度仍然是O(n^2),因此上述代码还可以进行一个优化:
def new_bubble_sort(alist):
"""冒泡排序"""
n = len(alist)
for i in range(1,n):
# count用于记录元素交换的次数
count = 0
for j in range(n-i):
if alist[j]>alist[j+1]:
alist[j], alist[j+1] = alist[j+1],alist[j]
count += 1
# 当count为0时,没有进行过交换操作,列表是天然顺序的
if count==0:
break
return alist
此时的时间复杂度为O(n)。