撲克牌相信大家都有玩過,直接插入排序和玩撲克牌很相似,右手抓取一張撲克牌,並把它插入左手拿著的排好序的撲克裡面。
如圖:
演算法介紹:
直接插入排序演算法是最簡單的演算法,也是最基本的演算法。SO,插入排序就是把當前待排序的元素插入到一個已經排好序的列表裡面。
插入排序的最壞已耗用時間是O(n2), 所以並不是最優的排序演算法。特點是簡單,不需要額外的儲存空間,在元素少的時候工作得好。
Java裡面有很多資料類型,選取的是最簡單的整數,但這並不失一般性。
即使是自己定製化的對象,實現了java.lang.Comparable, 把對應的 大於符號(>)以及小於符號(<)換成compareTo即可。
廢話不多說,直接上代碼:
/*@(#)InsertSort.java 2017-4-20 * Copy Right 2017 Bank of Communications Co.Ltd. * All Copyright Reserved */package com.sort.cn;/** * TODO Document InsertSort * <p> * * 插入排序(直接插入排序) * 平均O(n^2),最好O(n),最壞O(n^2);空間複雜度O(1);穩定;簡單 * * @version 1.0.0,2017-4-20 * @author Singit * @since 1.0.0 */public class InsertSort {public static void insertionSort(int[] a) { int tmp; for (int i = 1; i < a.length; i++) { for (int j = i; j > 0; j--) { if (a[j] < a[j - 1]) { tmp = a[j - 1]; a[j - 1] = a[j]; a[j] = tmp; } } } }public static void main(String[] args) {int[] a = { 45, 36, 67, 98, 70, 11, 24, 53 }; insertionSort(a); for (int i : a) System.out.print(i + " "); }}
輸出結果:
11 24 36 45 53 67 70 98
總結:
優點:穩定
空間複雜度O(1) ,時間複雜度O(n2)
最差情況:反序,需要移動n*(n-1)/2個元素
最好情況:正序,不需要移動元素
數組在已排序或者是“近似排序”時,插入排序效率的最好情況已耗用時間為O(n);插入排序最壞情況已耗用時間和平均情況已耗用時間都為O(n2)。
通常,插入排序呈現出二次排序演算法中的最佳效能。
對於具有較少元素(如n<=15)的列表來說,二次演算法十分有效。在列表已被排序時,插入排序是線性演算法O(n)。
在列表“近似排序”時,插入排序仍然是線性演算法。在列表的許多元素已位於正確的位置上時,就會出現“近似排序”的條件。
通過使用O(nlog2n)效率的演算法(如快速排序)對數組進行部分排序,然後再進行選擇排序,某些進階的排序演算法就是這樣實現的。