資料結構與演算法複習(二)插入排序
阿新 • • 發佈:2020-08-09
演算法描述:
插入排序將陣列分成有序和無序兩個部分,每次排序選擇無序部分的第一個元素與有序部分從後到前比較,找到適當位置插入。插入排序是一種穩定排序。
比如陣列
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),因此,插入排序適合資料量小的情況。