原理
就是让无序数组按间隔分为一小块一小块的,然后将每块进行直接插入排序,之后再整合起来,再分块再排序,知道不能分为止。这时的数组也已经排序完成了。
比如:
给定一个长度为10的数组a,
那么我们取间隔为10/2=5。
那么第一轮分组索引:
[0,5],[1,6],[2,7],[3,8],[4,9]
将其分别排序,接下来开始第二轮分组,间隔就取5/2=2
第二轮分组索引:
[0,2,4,6,8],[1,3,5,7,9]
将其分别排序,接下来开始第三轮分组,间隔就取2/2=1
第三轮分组,由于间隔为1,所以就是一个直接插入排序了
代码
public static void HillSort(long[] a)
{
int count = a.Length / 2;
int i, x;
long k;
while (count > 0)
{
i = 0;
while (i + count < a.Length)
{
for (int j = i + count; j < a.Length; j = j + count)
{
k = a[j];//设置基准点
for (x = j - count; x >= 0; x = x - count)//采用直接插入排序
{
if (a[x] > k)
{
a[x + count] = a[x];
}
else
{
a[x + count] = k;
break;
}
}
if (x < 0)
{
a[x + count] = k;
}
}
if (count == 1)
break;
else
i++;
}
count = count / 2;
}
}