冒泡排序应该算是排序算法中最简单的一个了。它会进行多轮排序,每一轮排序会比较相邻元素的大小,然后根据需求交换相邻元素。冒泡排序是一个稳定的排序,这里稳定的意思是两个大小相同的数字在排序前后,它们之间的相对位置不变。因为当两个元素相等时,冒泡排序不会采取任何措施,所以不会改变相等元素之间的相对位置。
下面是对序列[1, 4, 3, 2]排序的例子:
第1轮:
[1, 4, 3, 2]
[1, 3, 4, 2]
[1, 3, 2, 4]
第2轮:
[1, 3, 2, 4]
[1, 2, 3, 4]
第3轮:
[1, 2, 3, 4]
下面是网上的一个动态案例,很生动形象(https://www.jianshu.com/p/1458abf81adf)
下面就直接上python代码了:
def bubble(array):
length = len(array)-1
## 进行多轮排序,直到未被排序的元素长度为0
while length > 0:
## 中途已经完成排序
flag = 0
## 一轮排序
for i in range(length):
if array[i] > array[i+1]:
array[i], array[i+1] = array[i+1], array[i]
flag = 1
if flag == 0:
return array
length -= 1
return array
一轮排序后,序列里面最大的元素肯定就在序列的最右边,所以我们再对序列左边未排序的元素进行排序。就这样重复一轮排序,直到左边未排序的元素为0. 这里设置了一个flag,当序列已经提前完成排序时,就跳出while循环。因为只要序列已经完成排序了,在进行下一轮排序时就不会有相邻两个元素交换的情况发生,此时说明序列已经提前完成排序,不需要再继续进行了。
上面讲的是从小到大的排序,如果是从大到小的排序,最右边的元素就是最小的元素。
冒泡排序的时间复杂度为