希尔排序,不稳定,下面第二种增量确定方法效率更好些
//第一种,增量确定方法:增量折半
void ShellSort(int *arr, int len)
{
int i,j,k,d;
for(d=len/2; d>=1; d=d/2)//确定增量,增量不断减小,直至1
{
for(i=0; i<d; i++)//分成d个组
{
//对每组做插入排序
for(j=i+d; j<len; j=j+d)
for(k=j-d; k>=0; k=k-d)
if(arr[k+d] < arr[k])
Swap(arr+k+d,arr+k);
else
break;
}
}
}
//第二种,增量确定方法:增量每次除以3再加1
void ShellSort(int *arr, int len)
{
int i,j,k,d;
for(d=len/3+1; d>=1; )//确定增量,增量不断减小,直至1
{
for(i=0; i<d; i++)//分成d个组
{
//对每组做插入排序
for(j=i+d; j<len; j=j+d)
for(k=j-d; k>=0; k=k-d)
if(arr[k+d] < arr[k])
Swap(arr+k+d,arr+k);
else
break;
}
if(d > 1)
d = d/3+1;
else
break;
}
}