排序算法 --- 希尔排序

1 原理

希尔排序可以看作是对直接插入排序的优化. 直接插入是从前到后遍历数组, 每一个元素都往前移动到最合适的位置. 而希尔排序是利用间隔对数组进行分组, 然后再对每个小组进行子排序, 直到间隔为1.

2 具体步骤

首先要介绍一下间隔是什么.

间隔: 间隔是确定子分组的依据, 间隔是多少, 就有多少个子分组, 例如:

数组为: 7,3,2,5,8,1,6,9,0,4, 如果此时间隔为3, 那么如果两个数的间隔为三, 那么二者就为一组, 因为间隔多少就有多少组, 也就是说此时应该有三组, 其索引是:

  • 0, 3, 6, 9
  • 1, 4, 7
  • 2, 5, 8

对应的元素为:

  • 7, 5, 6, 4
  • 3, 8, 9
  • 2, 1, 0

了解了间隔之后, 下面就是希尔排序的具体步骤了(还是以上面的数组为例子).

1. 初始间隔为数组长度的一半(例子中数组长度为10, 初始间隔为5)

2. 把数组按照间隔进行分组, 组数为间隔大小(例中此时间隔为5, 那也就是第0, 5 一组, 1,6一组, 2, 7一组, 3, 8一组, 4, 9一组)

3. 对每个小组进行插入排序

4. 间隔除以2, 如果>0, 重复第二步.

代码:

vector<int> sortArray(vector<int>& nums) {
    int n = nums.size();
    int gap = n / 2;
    while (gap) {
        for (int i = 0; i < gap; i ++) {
            for (int cur_i = i + gap; cur_i < n; cur_i += gap) {
                for (int ii = cur_i; ii >= gap && nums[ii] < nums[ii - gap]; ii -= gap) {
                    swap(nums[ii], nums[ii - gap]);
                }
            }
        }
        gap /= 2;
    }
    return nums;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值