簡單冒泡排序
時間複雜度
O(n)->O(n*n)
原理
- 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
- 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
- 針對所有的元素重複以上的步驟,除了最後一個。
- 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
圖片來自 By Swfung8 - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=14953478
實現
優化
如果對[1,2,3,4,5,6,7,8]這樣一個列表進行排序的話,程序並不能識別它是一個已經排過序的列表。
如何進行改進?
可以打個標記
比如當上一次排序結束後,沒有發生交換,是否可以理解爲已經排序完成?
簡單選擇排序
原理
- 通過元素的兩兩比較,找出極值固定在某一端。
- 先假設索引爲0的值爲最大,然後用這個值和其他值進行比較,找出最大值,記下索引。
- 通過索引將最大值和索引爲0(1,2,3,)的值交換位置。
- 針對所有的未排序的元素重複以上的步驟,除了最後一個。
圖片來自 By Joestape89, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=3330231
實現
優化
同時找出最大值和最小值,同時固定兩個值。
如果排序的數據中有相等的元素,當某一次的比較得到的最大值和最小值相等,是否可以理解爲排序完成
代碼
簡單插入排序
原理
- 從第一個元素開始,該元素可以認爲已經被排序
- 取出下一個元素,在已經排序的元素序列中從後向前進行比較
- 如果該元素(已排序)大於新元素,將該元素移到下一位置
- 重複步驟3,直到找到已排序的元素小於或者等於新元素的位置
- 將新元素插入到下一位置中
- 重複步驟2~5
By Swfung8 - Own work, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=14961606