Insertion Sort
從第二個元素開始,往前比對,如果比前一個元素小,則交換位置,以此類推。
以 [30, 5, 1, 31, 10, 9, 2, 3, 4, 8, 7, 6]
來說:
- 第一次比對:從第二個元素開始往前比對,5 比 30 小,交換位置:
[5, 30, 1, 31, 10, 9, 2, 3, 4, 8, 7, 6]
- 第二次比對:從第三個元素開始往前比對,1 比 30 小,交換位置,1 比 5 小,交換位置:
[1, 5, 30, 31, 10, 9, 2, 3, 4, 8, 7, 6]
- 第三次比對:從第四個元素開始往前比對,31 比 30 大,順序不變:
[1, 5, 30, 31, 10, 9, 2, 3, 4, 8, 7, 6]
很像玩撲克牌在整理手牌時會用的方式。
若當前比對不成立時 (像上述範例的第三步驟),代表 31 也不會再比更前面的元素小了,所以可以直接結束該輪比對。
由於此特性,Insertion Sort 很適合用在幾乎快完成排序的資料上。例如某 server 上儲存一組排序過的陣列資料,之後有一筆新資料加進來時,使用 Insertion Sort 可以很快排序完成。
Practice
Solution
最好情況下,Insertion Sort 的時間複雜度為 O(n)。
最壞情況下的時間複雜度為 O(n²)。