shell排序的思想就是分组插入排序,隶属于插入排序的大范畴,又称缩小增量排序。
该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上还是很高的。
void shellsort(int a[],int n)
{
int i,j,gap,tmp;
for(gap=n/2;gap>0;gap/=2)
for(i=gap;i<n;i++)
for(j=i-gap;j>=0&&a[j]>a[j+gap];j-=gap)
{
tmp=a[j];
a[j]=a[j+gap];
a[j+gap]=tmp;
}
}
第一重循环每次对增量折半减小,后面两个循环是直接插入排序的方法。