shell排序的基本思想为:将待排序的数组分成若干较小的序列,然后再每个序列上分别使用插入排序算法进行排序。将原数组分成若干个短序列的方法为(这儿方法不唯一,下面介绍一种常用的方法):比如要对N个数进行排序,第一趟排序时,取间隔为step = N/2;第二趟排序时,取间隔step = step/2;依次进行,直至step=1。下面举一例子:
比如要对60, 17, 26, 93, 8, 40, 64, 40, 17, 78共10个数进行排序,第一次取step = 10/2=5,将数据分为(60,40)(17,64)(26,40)(93,17)(8,78),并在各小组内插入排序。结果为:40,17,26,17,8,40,64,40,93,78。第二次取step = 5/2 = 2,分为(40,17,64,78)(17,8,40)(26,40,93)并在各组内排序。结果为:17,8,26,40,17,40,64,40,93,78。 第三次取间隔为step = 2/2 =1,分为一组,插入排序结果为:8, 17, 17, 26, 40, 40, 60, 64, 78, 93
依次思想,有如下代码:
template <class T>
void shellSort(T* ptr,int n)
{
for(int step=n/2;step>=1;step/=2)
for(int i=step;i<n;i+=step)
if(ptr[i] < ptr[i-step]){
int temp = ptr[i];
int j;
for(j=i-step;j>=0;j-=step)
if(ptr[j] > temp)
ptr[j+step] = ptr[j];
else
break;
ptr[j+step] = temp;
}
}