希尔排序,因D.L.Shell于1959年提出而得名,核心思想:按照一定增量d,对比第i位元素和第i+d位元素。
希尔排序应该算是在插入排序的基础上开发出来的排序算法。
希尔排序是不稳定排序,时间复杂度为:希尔排序的时间复杂度是与选取的增量有关的,当选取的增量为1的时候,希尔排序就是插入排序时间复杂度为:;而Hibbard增量{1, 3, ..., 2^k-1}的希尔排序时间复杂度为:。
图示:一开始取数组的一半,之后每次取d为原来的一半:
C++代码:
int shellSort(int *pArray, int len)
{
if (NULL == pArray || len < 1)
{
return 0;
}
int dk = len;
int tmp = 0;
int i = 0;
int j = 0;
do
{
dk = dk / 3 + 1;
for (i = dk; i < len; i++)
{
if (pArray[i] < pArray[i - dk])
{
tmp = pArray[i];
j = i - dk;
for (; j >= 0 && tmp < pArray[j]; j -= dk)
{
pArray[j + dk] = pArray[j];
}
pArray[j + dk] = tmp;
}
}
} while (dk > 1);
return 1;
}
归路近,扣舷歌,
采真珠处水风多。
曲岸小桥山月过,
烟深锁,
豆蔻花垂千万朵。
-- 李珣 《南乡子·归路近》