目录
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;
}
}
}