排序_插入排序_希爾排序
阿新 • • 發佈:2021-08-25
直接插入排序演算法(參考本人博文https://www.cnblogs.com/KeithTee/p/15186334.html)的時間複雜度為O(n²),但是,如果待排序列為“正序”時,時間複雜度可以提高到O(n),由此可見,它更適用於基本有序的排列表和資料量不大的排列表。
希爾排序是基於上述兩點對直接插入排序改進而來。又稱縮小增量排序。
1 void ShellSort(ElemType A[] , int n){ 2 //A[0]是暫存單元,不是哨兵,當j <= 0時,插入位置已到 3 4 for (dk = n/2 ; dk >= 1 ;dk /= 2) //步長變化 5 for(i = dk + 1 ; i <= n ; ++ i) 6 if(A[i] < A[i -dk] ){ //需將A[i]插入有序增量子表 7 A[0] = A [i]; //暫存在A[0] 8 for( j = j -dk ; j>= && A[0]< A [j] ; j -= dk) 9 A[j + dk] = A [j]; //記錄後移,查詢插入的位置 10 A[j + dk] = A[0]; //插入 11 } 12 }
空間效率:同直接插入演算法,O(1)。
時間效率:最壞的情況下O(n²)。
穩定性:不穩定。(當相同關鍵字的記錄被劃分到不同的子表時,可能會改變他們之間的相對次序)
適用性:僅適用於線性表為順序儲存的情況。