冒泡排序(bubble sort)

[簡介]算法

  冒泡排序英語:Bubble Sort)是一種簡單的排序算法。它重複地走訪過要排序的數列,一次比較兩個元素,若是他們的順序錯誤就把他們交換過來。走訪數列的工做是重複地進行直到沒有再須要交換,也就是說該數列已經排序完成。這個算法的名字由來是由於越小的元素會經由交換慢慢「浮」到數列的頂端。spa

 

[算法複雜度] code

  冒泡排序對n個項目須要O(n^{2})的比較次數,且能夠原地排序。儘管這個算法是最簡單瞭解和實現的排序算法之一,但它對於少數元素以外的數列排序是很沒有效率的。xml

  冒泡排序是與插入排序擁有相等的運行時間,可是兩種算法在須要的交換次數卻很大地不一樣。在最好的狀況,冒泡排序須要O(n^{2})次交換,而插入排序只要最多O(n)交換。冒泡排序的實現(相似下面)一般會對已經排序好的數列拙劣地運行O(n^{2})次運算,而插入排序在這個例子只須要O(n)次運算。blog

  冒泡排序若是能在內部循環第一次運行時,使用一個旗標來表示有無須要交換的可能,也能夠把最好的複雜度下降到O(n)。在這個狀況,已經排序好的數列就無交換的須要。排序

 

[核心算法]ip

  1. 比較相鄰的元素。若是第一個比第二個大,就交換他們兩個。
  2. 對每一對相鄰元素做一樣的工做,從開始第一對到結尾的最後一對。這步作完後,最後的元素會是最大的數。
  3. 針對全部的元素重複以上的步驟,除了最後一個。
  4. 持續每次對愈來愈少的元素重複上面的步驟,直到沒有任何一對數字須要比較。

 

[口訣]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)

 

[示意圖]

相關文章
相關標籤/搜索