希尔排序的本质就是分组插入排序,希尔排序也叫缩小增量排序。
该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的 元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
void ShellSort1(int* array,int n)
{
if(array==NULL||n<1)
return;
for(intgrap=n/2;grap>0;grap/=2)
{
for(inti=0;i<grap;i++)
{
for(intj=i+grap;j<n;j+=grap)
{
if(array[j]<array[j-grap])
{
intk=j;
intkey=array[k];
while(k>=grap&&array[k-grap]>key){
array[k]=array[k-grap];
k-=grap;
}
array[k]=key;
}
}
}
}
}
void ShellSort2(int* array,int n)
{
if(array==NULL||n<1)
return;
for(intgrap=n/2;grap>0;grap/=2)
{
for(inti=grap;i<n;i++)
{
if(array[i]<array[i-grap])
{
intkey=array[i];
intk=i;
while(k>=grap&&array[k-grap]>key)
{
array[k]=array[k-grap];
k-=grap;
}
array[k]=key;
}
}
}
}