直接插入排序(Straight Insertion Sort)

寫排序方法之前還是先介紹一下排序相關的概念:

排序:將任一資源(內存中的數據或文件等等)通過某種方式整理成 按關鍵字 有序排列的過程 叫排序。

排序的穩定性: 對序列中的兩個或兩個以上的相等的數據(Ri = Rj , i != j), 排序前 Ri 先於 Rj , 排序後Ri 仍然先於 Rj ,則稱該排序是穩定的。否則稱爲該排序是不穩定的。

比較算法的評判標準: 時間複雜度、控件複雜度、算法的穩定性。

排序的分類:

1、內部排序: 所有數據元素都加載到內存中。

2、外部排序:待排序數據元素太多,無法全部加載到內存中,排序過程中必須在內、外存之間進行數據交換 。


直接插入排序:

直接插入排序的思想是,對於待排序元素集合 Rs={R1,R2 , ... Rn} , 將集合劃分爲已排好序的Rs1={R1,R2, ... Ri-1} ,和Rs2={Ri ,Ri+1, ... Rn} ,即將進行排序的元素Ri,插入到已經排好序的序列Rs1中,直到所有的元素都插入完爲止。顯然,R1是有序的。下面給一個序列Rs={37 ,  40 ,  38 ,  42 ,  461 ,  5 ,  7 ,  9 ,  12},

初始序列 37 40 38 42 461 5 7 9 12
第一趟排序結果 {37 40}              
第二趟排序結果 {37 38 40}            
第三趟排序結果 {37 38 40 42}          
第四趟排序結果 {37 38 40 42 461}        
第五趟排序結果 {5 37 38 40 42 461}      
第六趟排序結果 {5 7 37 38 40 42 461}    
第七趟排序結果 {5 7 9 37 38 40 42 461}  
第八趟排序結果 {5 7 9 12 37 38 40 42 461}
沒有寫的數字直接複製下來就ok 。

以下爲該算法的Java實現版:

public static void insertSort(int[] collection) {
        if (null == collection || collection.length == 0)
            return;
        int temp, j;
        for (int i = 1; i < collection.length; i++) {
            temp = collection[i];
            j = i - 1;
            while (j >= 0 && temp < collection[j]) {
                collection[j + 1] = collection[j];
                j--;
            }
            collection[j + 1] = temp;
        }

    }

該方法使用一個額外空間存儲當前待插入的元素,空間複雜度爲O(N),而每次插入元素都有可能移動一排好序的元素,其時間複雜度爲O(n^2).


二分插入排序:
二分插入排序是在查找插入位置時使用二分搜索算法,減少關鍵字的比較次數,但是卻不能減少數據元素移動的次數。關於二分查找方法請參見另一篇文章二分查找 , 二分插入排序的一個Java實現版本:

public static void binInsertSort(int[] collection) {
        if (null == collection || collection.length == 0)
            return;
        int temp, j, l, h, m;
        for (int i = 1; i < collection.length; i++) {
            l = 0;
            h = i ;
            m = -1;
            temp = collection[i];
            while (l < h) {
                m = (l + h) >> 1;
                if (temp > collection[m]) {
                    l = m +1;
                } else {
                    h = m -1;
                }
            }
            j = i - 1;
            if (m != -1) {
                while (j >= m && temp < collection[j]) {
                    collection[j + 1] = collection[j];
                    j--;
                }
            }

            collection[j+1] = temp;
        }

    }

直接插入排序就寫到這裏。

發佈了89 篇原創文章 · 獲贊 12 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章