python实现冒泡排序(Bubble sort)

冒泡排序算法的工作原理如下:

  • 比较相邻的元素,如果第一个比第二个大(升序),就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这一轮比较结束后,排在最后的元素会是最大的数,此时可看做这个数被归为了这组数据中的有序部分,那么剩下还没排序的即为无序部分。
  • 开始第二轮的比较,一直比到倒数第二个数,因为最后一个在上一轮已经冒泡冒到有序部分了。
  • 对越来越少的无序部分中的元素重复下一轮冒泡,直到无序部分中的元素全部排到有序部分中。

图示为第一轮冒泡,把包含9(n)个元素的列表当中最大的数先排到最后,这样的操作最多进行8(n-1)轮:

python实现冒泡排序(Bubble sort)

  • 最优时间复杂度:O(n) (表示遍历一次发现没有任何可以交换的元素,排序结束。)
  • 最坏时间复杂度:O(n2)
  • 稳定性:稳定

下面是代码实现:

def bubble_sort(alist):
    n = len(alist)
    for j in range(n-1, 0, -1):  #j:要经过j轮冒泡,值为n-1, n-2, n-3, ..., 3, 2, 1
        for i in range(j):  #注意j是递减的,轮数越小,要操作的元素就越多,但每轮上限为j-1
            if alist[i] > alist[i+1]:
                alist[i], alist[i+1] = alist[i+1], alist[i]

测试:

if __name__ == "__main__":
    li = [54,26,93,17,77,31,44,55,20]
    print(li)
    bubble_sort(li)
    print(li)

运行一下:

[54, 26, 93, 17, 77, 31, 44, 55, 20]
[17, 20, 26, 31, 44, 54, 55, 77, 93]