1、概述
氣泡排序是一種簡單的演算法,是指重複遍歷需要排序的元素列,一次比較兩個相鄰的元素,如果他們的順序(如從大到小、首字母a~z等)錯誤就把他們交換過來,遍歷的目的是重複的進行指導沒有相鄰元素需要交換 即該元素列已經排序完成。
2、演算法原理
1)比較相鄰的元素,如果第乙個比第二個大,就交換他們兩個
2)對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對,在這一點,最後的元素會是最大的數
3)針對所有的元素重複以上的步驟,除了最後乙個
4)持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較
3、舉例
需要對 1 4 6 2 8 這5個數按照從大到小的順序進行排序
1)首先,對第一位和第二位進行比較,明顯 1<4,所以交換 1 和 4 的位置
2)繼續比較第二位和第三位,發現 1<6,所以交換 1 和 6 的位置
3)繼續比較第三位和第四位,1<2 ,交換 1 和 2 的位置
4)最後比較 第四位和第五位 ,1<8 ,交換 1 和 8 的位置
經過上面一輪的比較,我們發現,1是最小的,且放在了最後。
下面是1上浮的過程,為什麼說是上浮?是由於數字是儲存在陣列中的,在swift中,陣列是先進後出的,棧一般在swift的實現都是通過陣列。並且1的上浮過程像水泡從水底上浮到水面,所以 演算法 叫 氣泡排序
剩餘的元素依次按照上述操作繼續比較,把最小的2放在倒數第二位,以此類推,最大的8位於首位
4、演算法實現
1)一般實現
按照冒泡的原理,一般實現為
func bubblesort(_ array : [int])}}
print(list)
print("count: ",count)
}注:資料的交換過程在swift中有3種
1)定義變數交換
let tmp = list[j]
list[j] = list[i]
list[i] = tmp
2)陣列自帶的交換方法
list.swapat(i, j)
3)使用元祖的交換方法
(list[i], list[j]) = (list[j], list[i])
4)也可以自定義swap方法
5)swift自帶的交換方法
swap(&list[i], &list[j])
2)外層優化
當發現在某一趟排序中沒有發生交換,則說明排序已經完成,所以可以在此趟排序後結束排序,在每趟排序前設定flag,當其未發生變化時,終止演算法
func bubblesort1(_ array : [int])
}if flag
}print(list)
print("count: ",count)
}
3)內層優化
每趟排序中,最後一次發生交換的位置後面的資料均以有序,所以可以記住最後一次交換的位置來減少排序的趟數
func bubblesort2(_ array : [int])
}k = swap
if flag
}print(list)
print("count: ",count)
}
4)方法的使用
print("冒泡")
let array = [1,3,6,9,0,5,2,4,8,7]
sortsummary.bubblesort(array)
sortsummary.bubblesort1(array)
sortsummary.bubblesort2(array)
print("\n")
執行結果:
冒泡[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
count: 9
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
count: 9
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
count: 4
注:可以從執行的迴圈次數看出,內層優化次數減少了
5、時間複雜度1)最好的情況下 即待排序的陣列本身是有序的,比較次數為n-1,沒有資料交換,即o(n)
2)最壞的情況下 即待排序的陣列是完全逆序的,比較次數為n*(n-1)/2,即o(n^2)
3)平均複雜度 o(n^2)
github**
注:排序的具體實現**在 sortsummary.swift
檔案裡 呼叫是在
viewcontroller.swift
排序演算法之氣泡排序(一)
氣泡排序是最常使用的一種排序演算法,演算法思想是從頭到尾遍歷陣列,將相鄰的兩個值進行比較,小的放在前面,大的放在後面。這樣第一趟排序之後,最後乙個位置所放的元素就是最大的值,第二趟排序之後,倒數第二個元素也排好了。經過n次排序之後,所有的值就排序完成了。比如無序陣列 3,1,4,2,5 第一躺 1,...
排序演算法之氣泡排序
參考 氣泡排序演算法的運作如下 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。若...
排序演算法之氣泡排序
對於大多數學計算機的人來說,氣泡排序應該都是接觸的第一種排序方式,氣泡排序的排序思想是比較簡單的,它的演算法的是 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了...