希尔排序(分治法)

希尔排序

采用分治法的思想,并且是插入排序的改进方法,时间复杂度位n^(3/2);
按增量gab变化,将数组分为n/gap组,每i+gap, i+2gap, i+3gap…为一组;
当gap=1时,整个数组就是一组。
[注意:gap/2并不是最优的增量,gap的取值很难计算,所以我们采用数据科学家提出的值,如之后代码所示]

在这里插入图片描述

代码所选步长和图例不同,不是gap/2.

template<typename T>
void shellSort(T arr[], int n){

	//这里h既为步长gap, 此处所选的步长数值较好
    int h = 1;
    while( h < n/3 )
        h = 3 * h + 1;

    while( h >= 1 ){

        for( int i = h ; i < n ; i ++ ){

            // 对 arr[i], arr[i-h], arr[i-2*h], arr[i-3*h]... 使用插入排序
            T e = arr[i];
            int j;
            for( j = i ; j >= h && e < arr[j-h] ; j -= h )
                arr[j] = arr[j-h]; //移位操作
            arr[j] = e;
        }

        h /= 3;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值