算法介绍
冒泡排序(Bubble Sort)是最容易理解的排序算法之一,但是运行效率有点低。
冒泡过程:对待排序部分(假设有M个元素)从头开始进行两两比较,如果第一个比第二个大(升序),就交换他们两个。这样本轮排序结束后就可以保证值最大的元素在最右边,那么下次只需要对前面(M-1)个数进行冒泡。
完整的冒泡排序就是进行N-1(N为数列长度)次的冒泡。
代码实现
def bubbleSort(source):
for i in range(len(source)-1, 0, -1): # i控制待排序区间的长度
for j in range(i): # 对下标为0到i-1的区域排序
if source[j] > source[j + 1]: # 保证值大的元素往后移
source[j], source[j + 1] = source[j + 1], source[j]
return source
s = [8,6,13,7,17,1,4,5,2]
print(bubbleSort(s))
# 输出:
# [1, 2, 4, 5, 6, 7, 8, 13, 17]
冒泡排序算法还可以进行改进,就是在算法中加入一个布尔变量来记录该轮排序是否产生过数据交换,若在某一轮排序中未发生数据交换,则说明待排序部分已经有序,无需再进行排序。
def bubbleSort_v2(source):
for i in range(len(source)-1, 0, -1):
exchange = False # 记录本轮排序是否产生过数据交换
for j in range(i):
if source[j] > source[j + 1]:
exchange = True
source[j], source[j + 1] = source[j + 1], source[j]
# 如果未发生交换,说明数列已经有序,直接返回
if not exchange:
print('程序于第%d轮结束'%(len(source) - i))
break
return source
# 为了检验改进是否有效,我们输入一个有序数列,那么程序应该在排序一轮后就结束。
s = [1,2,3,4,5,6,7]
print(bubbleSort_v2(s))
# 输出:
# 程序于第1轮结束
# [1,2,3,4,5,6,7]
算法效率分析
最优时间复杂度:O(N) (输入已经有序,一次扫描即可完成排序)
最坏时间复杂度:O(N2)(输入为反序)
平均时间复杂度:O(N2)
空间复杂度:O(1)
稳定性:因为交换的条件是大于(或者小于),故值相等的两个元素的前后顺序不会改变,所以算法稳定。