插入排序之shell排序分析及源码演示

名字来源

shell排序属于插入排序,因DL.Shell于1959年提出而得名。

缩小增量排序

shell排序利用了直接插入排序在原序列比较有序的情况下,排序速度较快的原理。通过多次排序,每次缩小增量,序列一次比一次有序,当增量为1时,序列已经有序。

源码

template <class T>

//shell_sort
int sort(T *t, int n)
{
    int d = n / 2;
    int comp_times = 0;
    while(d >= 1)
    {
        for(int i=0; i<d; i+=1)
        {
            for(int k=i+d; k<n; k+=d)
            {
                T current = t[k];
                int m=k-d;
                for(; m>=i; m-=d)
                {
                    comp_times++;
                    if(t[m] > current)
                    {
                        t[m+d] = t[m];
                    }
                    else
                    {
                        break;
                    }
                }
                t[m+d] = current;
            }
        }
        d /= 2;
    }
    return comp_times;
}

执行结果:
这里写图片描述

时间复杂度

与增量大小有关:
平均为??(不确定)

o(nlog2n)

空间复杂度

o(1)

稳定性

不稳定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值