希尔排序思想核心:
在直接插入排序的基础上,进行多次的预排序。
使其接近有序
(因为在接近有序的条件下,直接插入排序的效率非常高)
直接插入排序思想:(升序)
将一个数插入一个有序数组中,从后往前寻找,找到比他小的。插入到比他小的那个数的下一个位置即可
下面是具体代码
//arr表示数组,sz表示数组大小
for (int i = 0; i < sz-1; i++)
{
//将x插入[0,i]有序区间里
int end = i;
int x = arr[end + 1];
while (end>=0)
{
if (x < arr[end])
{
arr[end+1] = arr[end];
}
else
{
break;
}
end--;
}
arr[end + 1] = x;
}
希尔排序进行预排序,
实际上是进行多次的直接插入排序
只是每次不是+=1;
而是+=gap
代码如下
//arr表示数组,sz表示数组大小
int gap = sz;
while (gap>1)
{
gap /= 3+1;
for (int i = 0; i < sz-gap; i++)
{
int end = i;
int x = arr[end + gap];
while (end>=0)
{
if (x < arr[end])
{
arr[end + gap] = arr[end];
end -= gap;
}
else
{
break;
}
}
arr[end + gap] = x;
}
}
上述i++是因为将一次循环中i+=gap结合到了一起
实际上思想是一样的。只不过较简洁。