希尔排序,因D.L.Shell于1959年提出而得名,核心思想:按照一定增量d,对比第i位元素和第i+d位元素。

希尔排序应该算是在插入排序的基础上开发出来的排序算法。

希尔排序是不稳定排序,时间复杂度为:希尔排序的时间复杂度是与选取的增量有关的,当选取的增量为1的时候,希尔排序就是插入排序时间复杂度为:O\left ( n^{2} \right );而Hibbard增量{1, 3, ..., 2^k-1}的希尔排序时间复杂度为:O\left ( n^{3/2} \right )

图示:一开始取数组的一半,之后每次取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;
}

归路近,扣舷歌,

采真珠处水风多。

曲岸小桥山月过,

烟深锁,

豆蔻花垂千万朵。

  -- 李珣 《南乡子·归路近》