class ShellSort
{
public bool Sort(int[] datas)
{
if (datas.Length < 1) return false;
for (int gap = datas.Length / 2; gap > 0; gap /= 2)
{
for (int i = gap; i < datas.Length; i++)
{
//gap将集合分成几个小集合,跨着对比交换,最后gap=1时,减轻大集合的负担
int j = i;
while (j - gap >= 0 && datas[j] < datas[j - gap])
{
//当前集合的对比,让每个跨越式的小集合都是有序的
swap(datas, j, j - gap);//交换两个数的值
j -= gap;
}
}
}
return true;
}
private void swap(int[] data, int a, int b)
{
data[a] = data[a] + data[b];
data[b] = data[a] - data[b];
data[a] = data[a] - data[b];
}
}希尔排序是在插值排序中升级的,将数组改成几个大间距的不同集合,对这些集合进行交换的排序。交换大范围的数据,当在gap缩小到1的时候,就是插值排序了,这时候序列在前面大范围的比较交换后已经有了一定的顺序了,所以只需要交换少量数据就可以完成排序了。
测试代码:
static void TestShellSort()
{
int[] datas = { 5, 6, 9, 1, 100, 3, 7, 0, 2 };
ShellSort shellSort = new ShellSort();
shellSort.Sort(datas);
foreach (var data in datas)
{
Console.Write(data + " ");//0 1 2 3 5 6 7 9 100
}
}