目录
引例
希尔增量序列
原始希尔排序
代码(C语言)
时间复杂度
更多增量序列
Hibbard增量序列
Sedgewick增量序列
希尔排序(by Donald Shell)
引例
给以下序列进行排序:
先以5的间隔进行插入排序:
再以3的间隔进行插入排序:
最后再以1为间隔做插入排序,即常规插入排序 ,得到排序完成的序列:
希尔增量序列
- 定义增量序列
- 对每个进行“-间隔”排序()
注意:“-间隔”有序的序列,在执行“-间隔”排序后,仍然是“-间隔”有序的。
原始希尔排序
代码(C语言)
希尔排序在插入排序的基础上进行改进
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;
}
}
}
时间复杂度
最坏情况:
(表示上界,表示下界,即表示上界也表示下界,为正常值。)
原始希尔序列并不好用,我们举下面的例子:
可以发现,8、4、2间隔的插入排序并没有给序列成功排序,最后还是通过间隔1来完成排序的功能。
有结论:
增量元素不互质,则小增量可能根本不起作用。
更多增量序列
Hibbard增量序列
- ——相邻元素互质
- 最坏情况:
- 猜想:
Sedgewick增量序列
- { 1,5,19,41,109,...}—— 或
- 猜想:
void ShellSort( ElementType A[], int N )
{ /* 希尔排序 - 用Sedgewick增量序列 */
int Si, D, P, i;
ElementType Tmp;
/* 这里只列出一小部分增量 */
int Sedgewick[] = {929, 505, 209, 109, 41, 19, 5, 1, 0};
for ( Si=0; Sedgewick[Si]>=N; Si++ )
; /* 初始的增量Sedgewick[Si]不能超过待排序列长度 */
for ( D=Sedgewick[Si]; D>0; D=Sedgewick[++Si] )
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;
}
}
end
学习自:MOOC数据结构——陈越、何钦铭