直接插入排序变型版,将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序......最后选择增量为1,即使用直接插入排序,使最终数组成为有序。
最关键是理解按步长分组,通常取初始步长为序列长度的一半,即inc=n/2,然后一次减少一半。
分组过程是这样的,将序列中索引相隔距离为inc的元素成为一组,成为一组的元素,相邻之间的间隔为inc。
比如,对以下序列:
根据以上分析可以得代码基本是这样的组成,对不同inc的分组作直接排序,如下
while(inc>0)//对每一个分组作插入排序
{
InsertedDirectly(inc);
inc=inc/2;
}
其中InsertedDirectly(inc)代码和直接插入排序基本一样,主要是通过inc来操作序列下标达到“获取虚拟分组元素的目的”,当inc=1时,代码和直接插入一模一样。
InsertedDirectly(inc)
{
for(inti=inc;i<n;++i)
{
if(R[i]>R[i-inc])
{
//move theelement
InsertedItem = R[i];
for(intj=i-inc;j>=0&&Rj>InsertedItem;j-=inc)
{
R[j+inc]=R[j];
}
R[j+inc]=InsertedItem;
}
}
}
代码如下:
http://download.csdn.net/detail/mochounv/9691113
代码中的ShellInsertionSort(T[] source)。
参考:
http://www.cnblogs.com/jingmoxukong/p/4303279.html