希爾排序

希爾排序是希爾(DonaldShell)於1959年提出的一種排序算法。希爾排序也是一種插入排序,它是簡單插入排序經過改進之後的一個更高效的版本,也稱爲縮小增量排序,同時該算法是衝破O(n2)的第一批算法之一

思路:先取一個正整數d1’<’n,把所有序號相隔d1的數組元素放一組,組內進行直接插入排序;然後取d2’<’d1,重複上述分組和排序操作;直至di=1,即所有記錄放進一個組中排序爲止。
我們來看下希爾排序的基本步驟,在此我們選擇增量div=length/2,縮小增量繼續以div =div/2的方式,這種增量選擇我們可以用一個序列來表示,{n/2,(n/2)/2…1},稱爲增量序列。希爾排序的增量序列的選擇與證明是個數學難題,我們選擇的這個增量序列是比較常用的,也是希爾建議的增量,稱爲希爾增量,但其實這個增量序列不是最優的。此處我們做示例使用希爾增量。

這裏寫圖片描述
這裏寫圖片描述

void shellSort(vector<int> &arry)
 {
    for(int div=arry.size()/2;div>=1;div/=2)//增量序列 
        for(int i=0;i<div;i++)//分成div組 
            for(int j=i+div;j<arry.size();j+=div)//每組進行插入排序 
                for(int k=j;k>i;k-=div)
                    if(arry[k]<arry[k-div])
                    {       
                        int t=arry[k];
                        arry[k]=arry[k-div];
                        arry[k-div]=t;
                    }
                    else
                        break;
 }

希爾排序中對於增量序列的選擇十分重要,直接影響到希爾排序的性能。我們上面選擇的增量序列{n/2,(n/2)/2…1}(希爾增量),其最壞時間複雜度依然爲O(n2),一些經過優化的增量序列如Hibbard經過複雜證明可使得最壞時間複雜度爲O(n3/2)
其餘的增量序列還有Hibbard:{1, 3, …, 2^k-1},Sedgewick:{1, 5, 19, 41, 109…}該序列中的項或者是9*4^i - 9*2^i + 1或者是4^i - 3*2^i + 1。

文章參考自:https://www.cnblogs.com/chengxiao/p/6104371.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章