[簡介]算法
冒泡排序(英語:Bubble Sort)是一種簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,若是他們的順序錯誤就把他們交換過來。走訪數列的工做是重複地進行直到沒有再須要交換,也就是說該數列已經排序完成。這個算法的名字由來是由於越小的元素會經由交換慢慢「浮」到數列的頂端。spa
[算法複雜度] code
冒泡排序對個項目須要O(
)的比較次數,且能夠原地排序。儘管這個算法是最簡單瞭解和實現的排序算法之一,但它對於少數元素以外的數列排序是很沒有效率的。xml
冒泡排序是與插入排序擁有相等的運行時間,可是兩種算法在須要的交換次數卻很大地不一樣。在最好的狀況,冒泡排序須要次交換,而插入排序只要最多
交換。冒泡排序的實現(相似下面)一般會對已經排序好的數列拙劣地運行
次運算,而插入排序在這個例子只須要
次運算。blog
冒泡排序若是能在內部循環第一次運行時,使用一個旗標來表示有無須要交換的可能,也能夠把最好的複雜度下降到。在這個狀況,已經排序好的數列就無交換的須要。排序
[核心算法]ip
[口訣]utf-8
冒泡冒泡,大數下沉,小數上冒it
N - 1輪,兩兩比較io
相鄰換位,我停你跑
每輪計算,步數減小
[Source code]
# coding=utf-8 ALIST = [6, 5, 3, 1, 8, 7, 2, 4]
# bubble sort """ Description: From head to tail, swap each neighbor if previous one is larger than later one The largest one in each round will be found ant put into corresponding position 冒泡冒泡,大數下沉,小數上冒 N - 1輪,兩兩比較 相鄰換位,我停你跑 每輪計算,步數減小 """ """ 助記碼 i∈[0,N-1) //循環N-1遍 j∈[0,N-1-i) //每遍循環要處理的無序部分 swap(j,j+1) //兩兩排序(升序/降序) """ def bubble_sort(alist=None): blist = alist[:] N = len(blist) # Need N - 1 round to compare for i in range(0, N - 1): # In each round, need "N - i" step(s) for j in range(0, N - 1 - i): if blist[j] > blist[j + 1]: blist[j], blist[j + 1] = blist[j + 1], blist[j] return blist print "Final result: ", bubble_sort(ALIST)
[示意圖]