void ShellSort(int[] a, int n)
{
int gap=n/2;
while (gap>0)
{
//分组处理
for (int i=0; i<gap; i++)
for (int j=i+gap; j<n; j+=gap)
if (a[j]<a[j-gap])
{
int t=a[j];
int k=j-gap;
while (k>=0 && a[k]>t)
{
a[k+gap]=a[k];
k-=gap;
}
a[k+gap]=t;
}
gap=gap/2;
}
}
改进1: 我们用不着每次让i从0循环到gap-1这个遍历, 直接从gap, gap+1开始就行了。 于是 上面的第二层循环可以免了,代码如下。
void ShellSort(int[] a, int n)
{
int gap=n/2;
while (gap>0)
{
for (int j=gap; j<n; j++)
if (a[j]<a[j-gap])
{
int t=a[j];
int k=j-gap;
while (k>=0 && a[k]>t)
{
a[k+gap]=a[k];
k-=gap;
}
a[k+gap]=t;
}
gap=gap/2;
}
}
改进2:我们在改进1的基础上, 使用插入排序的最简写法, 把最外层while循环改写成for循环。
void ShellSort(int[] a, int n)
{
for (int gap=n/2; gap>0; gap/=2)
for (int j=gap; j<n && a[j]<a[j-gap]; j++)
for (int k=j; k-gap>=0 && a[k]<a[k-gap]; k-=gap)
swap(a[k], a[k-gap]);
}