圖解冒泡排序
冒泡排序是常用排序算法中最簡單的一種,可能很多同學看到這個標題之后就會很不屑的說,冒泡排序誰不會吖,你還在這里獻丑!我就獻丑了,怎么了!我驕傲了嗎?還不會的同學好好看了,以后你也可以在別人面前說,連冒泡排序都不會退出程序界啦。基於這個背景衍生了一個排序算法鄙視鏈。
排序算法鄙視鏈:寫冒泡的鄙視不會的,會選擇排序的鄙視只會冒泡的,會插入排序的鄙視選擇排序,希爾排序鄙視插入排序,快速排序鄙視希爾排序,歸並排序鄙視快速排序,堆排序鄙視歸並排序,基數排序鄙視堆排序。(純屬娛樂)
我們為了不站在鄙視鏈的最底端,今天就來學習下最簡單的一個排序冒泡排序。
冒泡算法名稱由來
冒泡算法的名字由來是因為越大的元素會經由交換慢慢“浮”到數列的頂端(升序或降序排列),就如同碳酸飲料中二氧化碳的氣泡最終會上浮到頂端一樣,故名“冒泡排序”。
冒泡排序基本思想
基本思想:重復遍歷要排序的數列,依次比較兩個相鄰元素的大小,根據條件交換元素,讓小的數下沉,大的數冒起來。(同樣可以反過來大的往下沉,小的往上冒)。
圖解冒泡排序
將列表[1,3,5,4,2]進行排序,把元素想象成一個小球。如下圖所示:
第一次循環進行交換最大值5浮到頂部。接下來進行第二次循環: 5在第一次已經冒出來,第二次循環不需要進行交換比較
第三次循環[4,5]已經冒出來,第三次循環不需要進行交換比較
第四次循環:到第4次循環結束之后,全部元素交換完成,得到一個有序的列表。
到底循環多少次?每一次交換多少次?
若初始文件是反序的,需要進行n-1趟排序。每趟排序要進行n-i次的比較(1≤i≤n-1),且每次比較都必須移動記錄三次來達到交換記錄位置。
Python代碼實現冒泡算法排序:
a = [1, 3, 5, 4, 2] n = len(a) for i in range(n - 1): for j in range(0, n - i - 1): if a[j] > a[j + 1]: a[j], a[j + 1] = a[j + 1], a[j] print(a)
最優時間復雜度O(n)冒泡算法時間復雜度
最壞時間復雜度O(n2)
平均時間復雜度O(n2)
冒泡算法穩定性
冒泡排序就是將大的元素往后移動,交換發生在兩個元素之間,且交換時不會影響到其他元素,只會發生交換與不交換,如果兩個元素相等是不會發生交換的。冒泡算法是一種穩定的排序算法。