希尔排序

一、希尔排序

定义增量序列 DM > DM-1 > … > D1 = 1

对每个 Dk 进行Dk-间隔排序( k = M, M-1, … 1 )

注意: Dk-间隔有序的序列,在执行Dk-1-间隔排序后,仍然是Dk-间隔有序的

 

希尔增量序列

原始希尔排序 DM = [ N / 2 ] , Dk = [ Dk+1 / 2 ]

void Shell_sort(ElementType A[], int N)
{
    for(D=N/2;D>0;D/=2) {    /* 希尔增量序列 */
        for(P=D;P<N;P++) {     /* 插入排序 */
            Tmp = A[P];
            for(i=P;i>=D && A[i-D]>Tmp;i-=D)
                A[i] = A[i-D];
            A[i] = Tmp;
        }
    }
}

最坏的情况:T = O(N2)

增量元素不互质,则小增量可能根本不起作用

 

二、更多增量序列

Hibbard增量序列

  • Dk = 2k – 1 — 相邻元素互质
  • 最坏情况: T = O( N3/2 )
  • 猜想: Tavg = O ( N5/4 )

Sedgewick增量序列

  • {1, 5, 19, 41, 109, … }  — 9x4i – 9x2i + 1 4i – 3x2i + 1
  • 猜想: Tavg = O ( N7/6 )Tworst = O ( N4/3 )

 

无欲速,无见小利。欲速,则不达;见小利,则大事不成。
原文地址:https://www.cnblogs.com/ch122633/p/9021588.html