資料結構——排序——插入排序——直接插入排序
阿新 • • 發佈:2021-04-30
資料結構——排序——插入排序——直接插入排序
排序的定義
排序:就是重新排列表中的元素,使表中的元素滿足按關鍵字有序的過程
演算法的穩定性:若待排序表中有兩個元素 A 和 B,其對應的關鍵字 a = b,且在排序前 A 在 B 前面,若使用某一排序演算法排序後,A 仍然在 B 的前面,則稱這個排序演算法是穩定的,否則稱排序演算法是不穩定的
直接插入排序
要將元素 L(i) 插入到已有序的子序列 L[1…i-1] 中,需要執行以下操作
1)查找出 L(i) 在 L[1…i-1] 中的插入位置 k
2)將 L[k…i-1] 中的所有元素依次往後移一個位置
3)將 L(i) 複製到 L(k)
i = 1 (49) 38 65 97 76 13 27 49
i = 2 (38 49) 65 97 76 13 27 49
i = 3 (38 49 65) 97 76 13 27 49
i = 4 (38 49 65 97) 76 13 27 49
i = 5 (38 49 65 76 97) 13 27 49
i = 6 (13 38 49 65 76 97) 27 49
i = 7 (13 27 38 49 65 76 97) 49
i = 8 (13 27 38 49 49 65 76 97)
空間複雜度:僅使用了常數個輔助單元,所有空間複雜度為 O(1)
演算法穩定性:由於每次插入元素時總是從後向前先比較再移動,所以不會出現相同元素相對位置發生變化的情況,即直接插入排序是一個穩定的排序方法
演算法適用性:直接插入排序演算法適用於順序儲存和鏈式儲存的線性表。為鏈式儲存時,可以從前往後查詢指定元素的位置
/**
* 直接插入排序
*/
void insertSort(int A[], int n) {
int i, j, temp;
for (i = 1; i < n; ++i) {
if (A[i] < A[i - 1]) {
temp = A[i];
for (j = i - 1; j >= 0 && A[j] > temp; --j) {
A[j + 1] = A[j];
}
A[j + 1] = temp;
}
}
}