Shell排序複雜度分析
1.大致思想
可以把希爾排序看作是發牌員,給每人輪流發一張牌。需要給n個人發牌,每人從第二張開始分別進行插入排序,那麼第一輪下來後,
每人的牌就是有序的。接下來按照剛剛的發牌順序把牌再收起來,減少人數,不斷重複這個步驟,直到只剩下一個人,那麼就是直接
插入排序。
希爾排序可以看作是插入排序的升級版本,透過分組預先插入排序,為後續的插如排序減少迴圈次數,達到提高效率的目的
簡單來說,希爾排序是
- 按照設定的 gap(<n)值,先將陣列分為不同的幾組,索引為i+gap*1、i+gap*2、...、i+gap*j(<n)的為一組
- 對每組進行插入排序
- 縮小gap值,直至縮小至1,回到第一步
- 排序完成
2.程式碼實現
void swap(int*a,int*b){
int tmp = *a;
*a=*b;
*b=tmp;
}
void shell_sort(int *a,int n){
assert(a);
for(int gap=n/2;gap>0;gap/=2){
for(int i=gap;i<n;i++){
for(int j=1;i-j*gap>-1;j++){
if(a[i-(j-1)*gap]<a[i-j*gap])
swap(&a[i-(j-1)*gap],&a[i-j*gap]);
}
}
}
}
和插入排序相似,從每組第二個元素開始遍歷,對本組元素進行插入排序;gap更新後,重複該過程;gap=1時,直接進行
插入排序,最後結束。
複雜度
由於gap設定的差別,shell排序會出現不同的時間複雜度,此處僅分析gap以除以2減小的結果
最優情況:
時間複雜度:O(N)
空間複雜度:O(1)
平均情況:
時間複雜度:O(Nlog_2N)
空間複雜度:O(1)