时间复杂度:O(n*logn) 以2为底的对数
空间复杂度:O(1)
稳定性:不稳定
举例:【4,3,7,2,5,1】
d=6/2=3
第一轮:4,3,7,2,5,1(分组情况)
从d+1开始循环遍历 所以 2,5,1分别与前面和自己一个分组的元素进行直接插入排序
2,3,7,4,5,1
2,3,7,4,5,1
2,3,1,4,5,7
第二轮。。。
/// <summary>
/// 希尔排序
/// </summary>
/// <param name="nums">待排数据</param>
public void Sort(int[] nums)
{
//按d分组 每隔d视为一组 组内进行直接插入排序 d取数组长度一半 并每轮后再取一半
int d = nums.Length;
while ((d = d / 2) != 0)
{
// 下标0 1 2 3 如果d=2 则 0和3是一组 所以下标从d+1开始,前面的肯定不存在同组的元素
//向后循环 每个元素找前面和他是一个分组的 并进行直接插入排序
//每轮并不是单独一个组的直接插入排序 而是把所有组的直接插入排序和在一起 所以可能d+1是 a组的 d+2是b组的 d+3又是a组的。。。
for (int i = d + 1; i < nums.Length; i++)
{
//向前找属于自己组
for (int tmpI = i; tmpI - d >= 0; tmpI -= d)
{
if (nums[tmpI] < nums[tmpI - d])
{
int tmp = nums[tmpI];
nums[tmpI] = nums[tmpI - d];
nums[tmpI - d] = tmp;
}
}
}
}
}