您的位置:首页 > 其它

希尔排序

2016-04-22 10:46 309 查看
1. 概述

简单插入排序效率不高的一个重要原因是每次只交换相邻的两个元素,这样只能消去一对错位的元素。希尔排序对插入排序进行改进,试图通过每次交换相隔一定距离的元素,达到排序效率上的提升。

希尔排序基本原理是,将待排序的一组元素按一定间隔分为若干个序列,分别进行插入排序。开始时设置的“间隔”较大,在每轮排序中将间隔逐步减小,直到“间隔”为1,也就是最后一步是进行简单插入排序。

希尔排序将“间隔”定义为一组增量序列,用来分割待排序列,即将位置之差等于当前增量的元素归属于同一个子序列,并分别进行插入排序;排好后在选取下一个增量,划分子序列再次排序,直到最后一个增量(一般为1)。

2. 希尔排序:

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

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

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

最坏情况: T = ( N2 )

3. 案例:





















4. 代码:

原始希尔排序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];
}
}
}
}5. 简单希尔排序不起作用:
1). 增量元素不互质,则小增量可能根本不起作用。

2). 如果希尔排序的数量级别是几万个,在加上Sedgewick增量序列,这个效果是比较好的。






6. [b]增量序列:[/b]

1) Hibbard 增量序列

Dk = 2k – 1 — 相邻元素互质
最坏情况: T =  ( N3/2 )
猜想:Tavg = O ( N5/4 )
2) Sedgewick增量序列
{1, 5, 19, 41, 109, … }
— 9*4i – 9*2i + 1 或4i – 3*2i + 1
猜想:Tavg = O ( N7/6 ),Tworst = O ( N4/3 ) 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 排序 希尔排序