希尔排序(Shell Sort)是一种分组插入排序算法。
首先取一个整数d1=n/2,将元素分为d1个组,每组相邻量元素之间距离为d1,在各组内进行直接插入排序;
取第二个整数d2=d1/2,重复上述分组排序过程,直到di=1,即所有元素在同一组内进行直接插入排序。
希尔排序每趟并不使某些元素有序,而是使整体数据越来越接近有序;最后一趟排序使得所有数据有序。
public void InsertSortGap(List<int> li,int Gap)//Gap表示间隔
{
int tmp = 0;
int j = 0;
for (int i = Gap; i < li.Count; i++)//i表示摸到的牌
{
tmp = li[i];
j = i - Gap;//j表示手里的牌
while (j >= 0&&li[j] > tmp)//如果手里的牌比摸到的牌大
{
li[j + Gap] = li[j];//手里这张的牌往后挪,继续查找手里的牌
j-= Gap;
}
li[j + Gap] = tmp;//如果手里的牌小,插入摸到的牌到这张牌后面
}
}
public void ShellSort(List<int> li)
{
int d = li.Count / 2;
while (d >= 1)
{
InsertSortGap(li, d);
d /= 2;
}
}
测试一下