for (int j = i; j < n - gap; j += gap)//内层循环,先排红,再排绿,最后排蓝
//注意内层循环的写法
{
//跟直接插入排序很像,不同的是需要使用gap
int end = j;
int tmp = a[end + gap];
while (end >= 0)
{
if (a[end] > tmp)
{
a[end + gap] = a[end];
end -= gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
复制代码
这是最初的写法,其实这个代码是可以优化的:
//预排序优化
for (int i = 0; i < n - gap; i++)
//把间隔为gap的多组数据同时排
//当到n-gap-1的位置就终止了
{
int end = i;
int tmp = a[end + gap];
while (end >= 0)
{
if (a[end] > tmp)
{
a[end + gap] = a[end];
end -= gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
复制代码
2.算法实现
//希尔排序void ShellSort(int* a, int n){ //一开始初始化gap为n int gap = n; while (gap > 1)//gap大于1都是预排序,gap==1时为直接插入排序 { //为保证gap最终结果为1,可以gap/=2,也可以是gap=gap/3+1; gap /= 2; //预排序优化