Shell排序複雜度分析

刘?發表於2024-03-09

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)

相關文章