希爾排序與增量序列的分析


希爾排序是沖破二次時間屏障 的第一批算法之一,實現過程是是通過較相隔較遠距離(稱為增量)的數,使得數移動時能跨過多個元素,則進行一次比較就可能消除多個元素交換。那些增量組成的序列就成為增量序列,不同的增量序列會對希爾排序的時間復雜度產生影響,在根本上希爾排序是屬於插入類排序。

圖示:

 

 

C語言代碼:

 

void shellsort(ElemType A[], int N)
{
    int i, j, Increment;
    ElemType Tmp;

    for (Increment = N / 2; Increment > 0; Increment /= 2)
        for (i = Increment; i < N; i++)
        {
            Tmp = A[i];
            for (j = i; j >= Increment; j -= Increment)
                if (Tmp < A[j - Increment])
                    A[j] = A[j - Increment];
                else
                    break;
            A[j] = Tmp;
        }
}

 

在希爾排序中希爾給出了一組增量序列:ht = N / 2, h[k+1] = h[k] / 2,即{N/2, (N / 2)/2, ..., 1},這個序列就叫做希爾增量。這個是編寫希爾排序時最常用的序列,但卻不是最好的,使用希爾增量時希爾排序的最壞情形運行時間為O(N2)。其余的增量序列還有Hibbard:{1, 3, ..., 2^k-1},使用Hibbard增量時希爾排序的最壞情形運行時間為O(N3/2),這個界適用於廣泛的增量序列。還有更好的序列Sedgewick:{1, 5, 19, 41, 109...}該序列中的項或者是9*4^i - 9*2^i + 1或者是4^i - 3*2^i + 1,這種增量最壞的復雜度為O(N4/3),平均復雜度為O(N7/6),但也沒有被完全證明。

希爾排序的性能在事件中是完全可以接受的,而且編程簡單,是對較大的輸入數據經常使用的算法。

 

 (文章摘錄《數據結構與算法分析C語言描述》機械工業出版社)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM