希尔排序算法--不稳定--步长

有关希尔排序算法叙述正确的是()。
A.最后一次的步长增量不一定为1
B.分割后子序列内部的排序算法是直接插入排序

C.希尔排序是稳定排序算法
D.分割后子序列内部的排序算法是直接选择排序
解析:

A.

B/D.希尔排序可以看做是一种改进的插入排序,通过分组减少逆序对数量,最终进行插入排序。

C.希尔排序在排序过程中可能会改变相同元素的相对位置,因此不是稳定的排序算法。

希尔排序的时间复杂度受增量序列影响,最坏情况下时间复杂度O(n^2),平均情况下时间复杂度接近O(n^1.3)。

  • 直接选择排序:不稳定。在选择过程中,相等元素的相对顺序可能会被打乱
  • 直接插入排序:稳定。插入排序在插入过程中,不会改变相等元素的相对位置
  • 希尔排序:不稳定。是一种改进的插入排序,排序过程中,相等元素的相对顺序可能被打乱
  • 快速排序:不稳定。基于分治法,划分过程中,相等元素的相对顺序可能被打乱

在给定四种当中,直接插入排序最稳定

思想

希尔排序又称“最小增量排序”,它是对插入排序的优化,基本思想是先将待排序序列分为若干子序列分别进行直接插入排序,待整个序列“基本有序”,在对全体进行一次直接插入排序。
希尔排序大概就是,选一组递减的整数作为增量序列(也就是步长)。最小的增量必须为1:DM>DM−1>...>D1=1DM>DM−1>...>D1=1

先用第一个增量把数组分为若干个子数组,每个子数组中的元素下标距离等于增量;
然后对每个子数组进行一次插入排序
再使用第二个增量,继续同样的操作,直到增量序列里的增量都使用过一次。
(增量为1时,就是对整个数组进行一次插入排序)

不断缩小增量直到增量为1,最后进行一次直接插入排序即可

void ShellSort(int* nums, int len)
{
    int i, j, tmp;
    for (int gap = len / 2; gap > 0; gap /= 2)
    {
        for (i = gap; i < len; i++)
        {
            tmp = nums[i];
            for (j = i - gap; j >= 0 && nums[j] > tmp; j -= gap)
            {
                nums[j + gap] = nums[j];
            }
            nums[j + gap] = tmp;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值