1. 程式人生 > 實用技巧 >資料結構與演算法複習(二)插入排序

資料結構與演算法複習(二)插入排序

演算法描述:

  插入排序將陣列分成有序和無序兩個部分,每次排序選擇無序部分的第一個元素與有序部分從後到前比較,找到適當位置插入。插入排序是一種穩定排序。

比如陣列

7 6 8 9 2 10

  剛開始排序時,有序部分只有一個元素7,無序部分為6 8 9 2 10;取無序部分第一個元素6與有序部分從後到前比較,插入到適當位置,則有序部分變為6 7,無序部分為8 9 2 10

6 7 8 9 2 10

  繼續選擇無序部分第一個元素8,與有序部分從後到前比較,插入適當位置,有序部分變為6 7 8,無序部分為9 2 10

6 7 8 9 2 10

  一直重複上述過程,直到將最後一個無序元素10插入完成

演算法C語言實現如下

 1 void insertSort(int A[], int len)
 2 {
 3     int P, j;
 4     int tmp;
 5 
 6     if (A == NULL || len <= 1) {
 7         return;
 8     }
 9 
10     for (P = 1; P < len; p++) {
11         tmp = A[P];
12         for (j = P; j > 0 && A[j - 1] > tmp; j--) {
13             A[j] = A[j - 1
]; 14 } 15 A[j] = tmp; 16 } 17 }

空間複雜度:

只需要一個臨時快取tmp,空間複雜度為O(1)

時間複雜度:

最好情況:已經有序,那麼只要比較(N-1)次;

最壞情況:剛好逆序,對於每一個P值,都要執行P+1次A[j]賦值操作,執行時間為O(N2)

  插入排序的平均情形是O(N2),因此,插入排序適合資料量小的情況。