插入排序法是經典的三大 O(n^2) 排序演算法之一。與其叫他「插入演算法」,不如叫他「插隊演算法」更能表達其運作原理,可以想像做一個未排序的物件(人?)隊伍,從頭開始,每個物件都有一次機會向前插隊到它該去的位置。
插入排序法最佳狀況下(已排序好數列),只需要掃描一遍就可以結束,故 O(n) ,但最差狀況需要做 n*(n-1)/2 - (n-1) 次的賦值,。但是,插入排序法在處理少量數據的能力平均來說是三大O(n^2)排序演算法中最佳的,部分快速排序法到最後也是用插入排序法排少量的數據,是一定要當常識記得的演算法之一 (XD)。
複雜度:
- 時間:最佳 O(n) 最差 O(n^2)
- 空間:O(n), O(1) 輔助用
步驟:
- 第一個物件當作已經排序好。
- 向後逐一取出物件,並從該物件開始向前掃描其他物件。
- 若前一個物件大於(小於)此物件,兩者對調位置。 (在實作上使用賦值而不對調)
- 重複步驟3. 一直交換到前一個物件不再大於(小於)此物件。
- 重複步驟2. 從原位置繼續看下一個物件。
Java 簡單實現:
public class InsertionSort { public void sort(int[] array) { // 一個一個看 for(int i=0; i < array.length; ++i) {int target = array[i]; int j = i; // 向前檢查 (插隊) while((j > 0) && (array[j - 1] > target)) { array[j] = array[j - 1]; j--; } array[j] = target; } } }
沒有留言:
張貼留言
部落格是發表個人言論的地方,歡迎您給留言來進行討論與給予指教,但也希望您以理性開放的態度來看待文章內容,如果我也會尊重您的留言一般。謝謝