算法-排序算法-希尔排序

希尔排序

希尔排序的基本思想是:对于一个含有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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值