1. 程式人生 > >經典排序算法(2) -插入排序 InsertSort

經典排序算法(2) -插入排序 InsertSort

都是 取出 int strong 逆序排列 函數 div 出現 等於

插入排序(InsertSort)在<<算法導論>>裏的描述相當貼切:插入排序非常類似於整撲克牌。在開始摸牌時,左手是空的,牌面朝下放在桌上。接著,一次從桌上摸起一張牌,並將它插入到左手一把牌中的正確位置上。為了找到這張牌的正確位置,要將它與手中已有的牌從右到左地進行比較。無論什麽時候,左手中的牌都是排好序的。如果輸入數組已經是排好序的話,插入排序出現最佳情況,其運行時間是輸入規模的一個線性函數。如果輸入數組是逆序排列的,將出現最壞情況。平均情況與最壞情況一樣,其時間代價是O(n^2)。
操作步驟
⒈ 從第一個元素開始,該元素可以認為已經被排序
⒉ 取出下一個元素,在已經排序的元素序列中從後向前掃描
⒊ 如果該元素(已排序)大於新元素,將該元素移到下一位置
⒋ 重復步驟3,直到找到已排序的元素小於或者等於新元素的位置
⒌ 將新元素插入到下一位置中
⒍ 重復步驟2~5

Java代碼實現如下:

public static void insertSort(int[] A) {
    int key = 0;
    int j = 0;
    for (int i = 1; i < A.length; i++) {
        //要插入的數
        key = A[i];
        for (j = i - 1; j >= 0 && key < A[j]; j--) {
            A[j + 1] = A[j];
        }
        A[j + 1] = key;
    }
}

穩定
空間復雜度O(1)
時間復雜度O(n^2)
最差情況:反序,需要移動n*(n-1)/2個元素
最好情況:正序,不需要移動元素
因而,插入排序不適合對於數據量比較大的排序應用。但是,如果需要排序的數據量很小,例如,量級小於千,那麽插入排序還是一個不錯的選擇。

經典排序算法(2) -插入排序 InsertSort