希尔排序
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 )
简单插入排序效率不高的一个重要原因是每次只交换相邻的两个元素,这样只能消去一对错位的元素。希尔排序对插入排序进行改进,试图通过每次交换相隔一定距离的元素,达到排序效率上的提升。
希尔排序的基本原理是,将待排序的一组元素按一定间隔分为若干个序列,分别进行插入排序。开始时设置的“间隔”较大,在每轮排序中将间隔逐步减小,直到“间隔”为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 )
相关文章推荐
- 在命令行用 sort 进行排序
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- 文件遍历排序函数
- C#选择排序法实例分析
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#实现Datatable排序的方法
- 超大数据量存储常用数据库分表分库算法总结
- SQLSERVER的排序问题结果不是想要的
- Windows Powershell排序和分组管道结果
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#通过IComparable实现ListT.sort()排序
- C#选择法排序实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- SQL学习笔记四 聚合函数、排序方法
- C#实现的算24点游戏算法实例分析