目录
1.什么是希尔排序
希尔排序是对插入排序的改进,通过计算得到一个增量序列,然后以增量序列里的元素作为间隔,跳着将待排序列利用插入排序先调整成部分有序。
假设增量序列是{5 3 1},通过例子看部分调整是怎么做的。图片来自中国大学mooc浙江大学数据结构课程




在五间隔已经排序完成的基础上,假如增量序列下一个元素是3的话,就以3作为间隔继续进行插入排序

假设3间隔排序也完成,可以看出待排序列已经基本有序了,这时候在用一次间隔为1的插入排序就能使待排序列完全有序

2.希尔排序的关键点
希尔排序本质上还是插入排序,只不过先用增量调整了不相邻的逆序对。Sedgewick增量序列:int Sedgewick[] = {260609,146305,64769,36289,16001,8929,3905,2161,929, 505,209, 109, 41, 19, 5, 1, 0};
3.希尔排序怎么用
typedef int ElmentType;
void ShellSort(ElmentType S[], int N)
{
int Si,d;
/* 这里只列出一小部分增量 */
int Sedgewick[] = {260609,146305,64769,36289,
16001,8929,3905,2161,929, 505,
209, 109, 41, 19, 5, 1, 0};
/* 初始的增量Sedgewick[Si]不能超过待排序列长度 */
for ( Si=0; Sedgewick[Si]>=N; Si++ );
for(d = Sedgewick[Si]; d > 0; d=Sedgewick[++Si])
{
int i,j;
for(i = d; i<N;i++)
{
ElmentType tmp = S[i];
for(j = i;j >=d && (tmp < S[j-d]); j-=d)
{
if(tmp < S[j-d])
S[j] = S[j-d];
}
S[j] = tmp;
}
}
}
希尔排序是一种改进的插入排序算法,通过增量序列逐步减少间隔进行排序。本文详细介绍了希尔排序的工作原理,关键点在于增量序列的选择,如Sedgewick序列,并给出了C语言实现示例。希尔排序的核心是将待排序列先进行部分有序调整,然后用较小的间隔进行插入排序,最终达到完全有序状态。
366

被折叠的 条评论
为什么被折叠?



