希尔排序

本文深入探讨了Shell排序算法的基本思想、实现方式及优化策略,详细解释了如何通过分组插入方法减少元素交换次数,提高排序效率。

   基本思想编辑

先取一个小于n的整数d1作为第一个 增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行 直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

该方法实质上是一种分组插入方法引

比较相隔较远距离(称为 增量)的数,使得数移动时能跨过多个元素,则进行一次比 [1] 较就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的 排序算法中实现了这一思想。算法先将要排序的一组数按某个 增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行,在每组中再进行排序。当 增量减到1时,整个要排序的数被分成一组,排序完成。
一般的初次取序列的一半为 增量,以后每次减半,直到增量为1。

/* shellsort: sort v[0]...v[n1]
into increasing order */
void shellsort(int v[], int n)
{
int gap, i, j, temp;
for (gap = n/2; gap > 0; gap /= 2)
    for (i = gap; i < n; i++)
        for (j=igap; j>=0 && v[j]>v[j+gap]; j=gap)
    {
             temp = v[j];
             v[j] = v[j+gap];
             v[j+gap] = temp;
        }
}


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值