希尔排序
希尔排序的基本思想是:对于一个含有n个元素的序列,先取一个小于 n/2 的整数 d1 做为增量,把元素分成 d1组(每一组含有的元素在序列上间隔d1 个位置),每次遍历先对各组进行直接插入排序;然后,取第二个增量 d2 < d1 重复上述分组和排序,指定所取的增量dt = 1,即所有记录放在同一组中进行直接插入排序为止。
/// <summary>
/// 希尔排序,由插入排序改良,插入排序移动间隔为1,希尔排序通过减少交换次数提高性能(直接交换了i与i+gap 的元素,中间的元素被跨过)
/// 最坏时间复杂度为O(n3/2),不是稳定算法
/// </summary>
/// <typeparam name="T"></typeparam>
public static IList<T> ShellSort<T>(IList<T> arr) where T : IComparable
{
// gap 为增量
for (int gap = arr.Count / 2 - 1; gap > 0; gap /= 2)
{
// 从第 gap 个元素逐个多其所在组进行插入排序
for (int i = gap; i < arr.Count; i++)
{
int j = i;
T tmp = arr[j];
if (arr[j - gap].CompareTo(arr[j]) > 0)
{
while (j - gap > 0 && tmp.CompareTo(arr[j - gap]) < 0)
{
arr[j] = arr[j - gap];
j -= gap;
}
arr[j] = tmp;
}
}
}
return arr;
}