希尔排序

//希尔排序

//属于插入排序,解决数据量大,而且数组还不接近有序

//gap进行分组,对每一组的数据进行排序,最后gap--到1,就很容易排好,这样花费的时间复杂度较小
void ShellSort(int* array, int size)
{
    int gap = 3;

//gap表示间隔,分组数据之间的间隔
    while (gap >= 1)
    {
        for (int i = gap; i < size; i++)
        {
            //key记录要插入的数据
            int key = array[i];
            //end表示要比较的数据
            int end = i - gap;
            //end不能越界(一般是插入时最小的数据的时候)
            while (end >= 0 && key < array[end])
            {
                //插入数据比比较数据小,则将其往后移动,然后end向前搜索
                array[end + gap] = array[end];
                end-=gap;
            }

            //数赋值
            array[end + gap] = key;
        }
        gap--;
    }
}

 


//优化代码如下:
//思路:先找到要插入的位置,然后进行插入
//Tip:如果是一般的插入排序,相对于来说比较简单
//基本上此代码中的i从1开始,默认最开始已经有了一个数据

void ShellSort(int* array, int size)
{
    //这里的gap仍旧是表示间隔
    int gap = size;
    while (gap > 1)
    {
        gap = gap / 3 + 1;
        for (int i = gap; i < size; ++i)
        {
            int k = array[i];
            int end = i - gap;
            while (end >= 0 && array[end] > k)
            {
                array[end + gap] = array[end];
                end -= gap;
            }
            array[end + gap] = k;
        }
    }
}

//稳定性:不稳定
//时间复杂度:O(N^2)
//空间复杂度:O(1)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值