插入排序 の implementationjava
插入排序就像打賭的時候,好比雙扣。抽牌的時候,一次拿一張牌,這張牌和以前的牌一張張比較。選擇把這張牌插入什麼位置,排好順序的位置後打牌更順。要否則得一個一個找到時麻煩。也不利於打牌的大局觀。看下圖git
假設第一次抽到梅花7, 不用排序。由於只有一張github
接着抽到梅花10 。由於10比7大,因此不用排序。less
再接着抽卡。發現抽到了梅花5 。這個時候不要猶豫,2點真的不算大的。果斷棄牌ide
接着咱們拿 5 和 10 比較。 5 小於 10 因此交換位置。性能
拿5再和7比。 5 比 7 小。 因此交換 5 和 7 的位置 獲得。spa
這個時候就已是sorted的了。 原理就是這樣子。code
由於比較簡單。直接貼上代碼blog
// O(n^2) 最壞的狀況 // 最好的狀況 O(n) public static void sort(Comparable[] a) { for (int i = 1; i < a.length; i++) { for (int j = i ; j > 0; j--) { if (less(a[j], a[j - 1])) exch(a, j, j - 1); else break; } } } public static void sort(Comparable[] a, int low, int hi) { for (int i = low; i <= hi ; i++) { for (int j = i ; j > low; j--) { if (less(a[j], a[j - 1])) exch(a, j, j - 1); else break; } } }
完整的代碼在https://github.com/Cheemion/algorithms/blob/master/src/com/algorithms/sort/InsertionSort.java排序
性能分析
最壞的狀況就是每次抽到的卡是最小的。這個時候每次都須要從尾部遍歷到頭部。時間是N ^ 2成正比
最好的狀況就是已經排好序了。由於已經排好序了。因此每次抽到的牌都不須要排序。 時間是 N 成正比