在要排序的一組數中,對當前還未排好序的範圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較後發現它們的排序與排序要求相反時,就將它們互換。
以隨機產生的五個數為例: li=[354,405,469,82,345]
氣泡排序是怎麼實現的?
首先先來個大迴圈,每次迴圈找出最大的數,放在列表的最後面。在上面的例子中,第一次找出最大數469,將469放在最後乙個,此時我們知道
列表最後乙個肯定是最大的,故還需要再比較前面4個數,找出4個數中最大的數405,放在列表倒數第二個......
5個數進行排序,需要多少次的大迴圈?? 當然是4次啦!同理,若有n個數,需n-1次大迴圈。
現在你會問我: 第一次找出最大數469,將469放在最後乙個??怎麼實現的??
嗯,(在大迴圈裡)用乙個小迴圈進行兩數比較,首先354與405比較,若前者較大,需要交換數;反之不用交換。
當469與82比較時,需交換,故列表倒數第二個為469;469與345比較,需交換,此時最大數469位於列表最後乙個啦!
難點來了,小迴圈需要多少次??
進行兩數比較,從列表頭比較至列表尾,此時需len(array)-1次!! 但是,嗯,舉個例子吧: 當大迴圈i為3時,說明此時列表的最後3個數已經排好序了,不必進行兩數比較,故小迴圈需len(array)-1-3. 即len(array)-1-i
**如下:
>>> defbubble(array):
for i in range(len(array)-1):
exchange = false
for j in range(len(array)-i-1):
if array[j] > array[j+1]:
array[j],array[j+1] = array[j+1],array[j]
exchange = true
if not exchange:
break
>>> array = [3,4,42,9,1]
>>>bubble(array)
(array)
[1, 3, 4, 9, 42]
注:這裡進行了一步優化,加入了乙個exchange判斷符,如果exchange是false,說明剩下未排列的那些資料沒有進行過交換,也就是說已經全部排序完成
氣泡排序複雜度:
時間複雜度: 最好情況o(n), 最壞情況o(n^2), 平均情況o(n^2)
**
演算法基礎之氣泡排序
是讓最大的數浮動到陣列最後的位置,其次大的數浮動到陣列倒數第二個位置。當然,你也可以從大到小排序,也可以從後向前冒泡。其特徵操作是相鄰元素的比較和交換。bubble sort a for i a.length to 1 for j 1 to i ifa j a j 1 exchance a j an...
基礎演算法之氣泡排序
1.今天面試被問到最簡單的氣泡排序,氣泡排序看似簡單其實也不簡單,在此重新複習一下氣泡排序 氣泡排序的時間複雜度是n平方,如果陣列已經有序,可以進行優化,sort3方法在陣列有序的時候,只需要遍歷一次陣列,時間複雜度是n,空間複雜度只需要乙個int變數在交換的時候使用 public void sor...
基礎排序演算法之氣泡排序
1.主體 兩個迴圈 2.時間複雜度 o n 2 3.過程 對於公升序,比較相鄰兩個數,如果第二個數小,則交換位置 從數列後往前比較,最終第乙個數是最小的 重複上述步驟 demo include includeusing namespace std 氣泡排序 void my swap int firs...