1. 程式人生 > 其它 >資料結構——排序——插入排序——直接插入排序

資料結構——排序——插入排序——直接插入排序

資料結構——排序——插入排序——直接插入排序

排序的定義

排序:就是重新排列表中的元素,使表中的元素滿足按關鍵字有序的過程

演算法的穩定性:若待排序表中有兩個元素 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)

時間複雜度:O( n 2 n^2 n2)
演算法穩定性:由於每次插入元素時總是從後向前先比較再移動,所以不會出現相同元素相對位置發生變化的情況,即直接插入排序是一個穩定的排序方法
演算法適用性:直接插入排序演算法適用於順序儲存和鏈式儲存的線性表。為鏈式儲存時,可以從前往後查詢指定元素的位置

/**
 * 直接插入排序
 */
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; } } }