基本思想编辑
先取一个小于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;
}
}
本文深入探讨了Shell排序算法的基本思想、实现方式及优化策略,详细解释了如何通过分组插入方法减少元素交换次数,提高排序效率。
18万+

被折叠的 条评论
为什么被折叠?



