1、基本思想
希尔排序又称增量缩小排序,是对直接插入排序的一种改进,分组插入方法。
先将序列按增量划分为元素个数相同的若干组,使用直接插入排序法进行排序,然后不断缩小增量直至为1,最后使用直接插入排序完成排序。
2、假设待排序数组为[2 6 1 5 3 8 9 4],增量取4、2和1
第一趟待排序数组可分成以下四个虚拟组:2和3一组;6和8二组;1和8三组;5和4四组
并不是临时的两个数字分组,而是每隔4个数取一个,每隔4个再取一个,这样取出来的数放到一组,把它们当成一组,但并不是实际分组,只是当成一组来看,所以“组”实际上并不存在,只是为了说明分组关系。
第二趟排序增量取2,可分成两组。
第三趟排序增量取1,即每隔一个取一个组成新组,实际上就是直接插入排序算法了。
3、选取增量注意事项
1)增量要越来越小,最后一个增量必须为1;
2)应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况。
3)建议取值规则:第一次取总长度的一半,第二次取一半的一半,依次类推直到1为止。
4、希尔排序算法是一种不稳定的排序方法。
时间复杂度O(n^1.25),空间复杂度O(1)。
5、代码
将elem[]数组按递增进行希尔排序
void SubShellSort(int *elem, int elemLen, int increment)
{
int i = 0;
int j = 0;
int tempElem = 0;
for(i = increment; i < elemLen;i++)
{
tempElem = elem[i];
j = i - increment;
if(elem[j] < tempElem)
{
continue;
}
while(j >= 0)
{
if(elem[j] > tempElem)
{
elem[j+increment] = elem[j];
j -= increment;
}else
{
break;
}
}
elem[j+increment] = tempElem;
}
}
void ShellSort(int *elem, int elemLen)
{
if(elem == NULL || elemLen == 0)
{
return;
}
int increment = elemLen/2;
while(increment >= 1)
{
SubShellSort(elem, elemLen, increment);
increment = increment/2;
}
}