希尔排序:将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序......最后选择增量为1,即使用直接插入排序,使最终数组成为有序。
增量的选择:在每趟的排序过程都有一个增量,至少满足一个规则 增量关系 d[1] > d[2] > d[3] >..> d[t] = 1 (t趟排序);根据增量序列的选取其时间复杂度也会有变化,这个不少论文进行了研究,在此处就不再深究;本文采用首选增量为n/2,以此递推,每次增量为原先的1/2,直到增量为1;
下图详细讲解了一次希尔排序的过程:

希尔排序

希尔排序

程序如下:

void shell_sort(int a[],int n)
{
    int i,j,temp,h;
    for(h=n/2;h>0;h=h/2)
    {
       for(i=h;i<n;i++)
       {
            temp=a[i];
            for(j=i-h;(j>=0&&temp<a[j]);j=j-h)
                {
                        a[j+h]=a[j];
                }
            a[j+h]=temp;
       }
   }
}

相关文章: