基本排序算法 之四 ——希尔排序

 


基本排序算法总结与对比 之四  ——希尔排序 


1、希尔排序

       希尔排序实质是不断对数组分组,并对每组数据进行插入排序,分组由 len/step组 直到 1组(len为数组长度,step为分组长度)。

       本质上讲,希尔排序算法是直接插入排序算法的一种改进,分组后数据移动长度变短,减少了其复制的次数,速度要快很多。 

template<typename T>
void shellSort(T arr[], int lo, int hi)
{
    for(int step = (hi - lo) >> 1; step > 0; step >>= 1)    //步长从数列长度的一半开始,每轮对折;步长 = 子数组的个数;子数组中相邻俩元素 对应 原数组中 下标相差 一个步长的俩元素
    {
        for(int i = 0; i < step; i++)    //对每一个子数组都要进行直接插入排序,共step个子数组
        {
            //一下跟直接插入排序步骤一样,区别在于 子数组相邻元素 对应到 原数组中 下标差 为step
            for(int j = lo + i + step; j < hi; j += step)    //原数组[lo+i] 为 各子数组[lo] 
            {                                           //原数组[lo+i+step] 为 各子数组[lo+1]
                tmp = arr[j];
                int k = j - step;
                while(k >= lo + i && arr[k] > tmp)
                {
                    arr[k + step] = arr[k];
                    k -= step;
                }
                arr[k + step] = tmp;
            }
        }
    }
}

       希尔排序的复杂度要比直接插入排序法的O(n^2)好一些,平均为O(n^1.5)左右,希尔排序也不是稳定的排序算法。需要注意的是:希尔排序并不像网上有流传的比 快速排序 还快! 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值