希尔排序

直接插入排序变型版,将无序数组分割为若干个子序列,子序列不是逐段分割的,而是相隔特定的增量的子序列,对各个子序列进行插入排序;然后再选择一个更小的增量,再将数组分割为多个子序列进行排序......最后选择增量为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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值