希尔排序

描述

希尔排序可以看作是一个冒泡排序或者插入排序的变形。希尔排序在每次的排序的时候都把数组拆分成若干个序列,一个序列的相邻的元素索引相隔的固定的距离gap,每一轮对这些序列进行冒泡或者插入排序,然后再缩小gap得到新的序列一一排序,直到gap1

比如对于数组[5,2,4,3,1,2],第一轮gap=3拆分成[5,3]、[2,1][4,2]三个数组进行插入排序得到[3,1,2,5,2,4];第二轮gap=2,拆分成[3,2,2][1,5,4]进行插入排序得到[2,1,2,4,3,5];最后gap=1,全局插入排序得到[1,2,2,3,4,5]

C++代码实现

class Solution {
public:
    vector<int> sortArray(vector<int>& nums) {
        int gap = nums.size() / 2;
        while (gap > 0) {
            for (int i = 0; i < gap; i++) {                        // 对每个子序列进行排序
                for (int j = i+gap; j < nums.size(); j+=gap) {     // 插入排序的部分
                    int temp = j;
                    while (temp > i && nums[temp] < nums[temp-gap]) {
                        swap(nums, temp, temp-gap);
                        temp -= gap;
                    }
                }
            }
            gap -= 1;
        }
        return nums;
    }
private:    
    void swap(vector<int>& nums,int m,int n){
        int temp = nums[m];
        nums[m] = nums[n];
        nums[n] = temp;
    }
}

希尔排序算法,运行时间在很大程度上取决于它使用的间隔,在实际使用中,其时间复杂度仍然是一个悬而未决的问题,基本在*O(n2)O(n4/3)*之间。

空间复杂度是O(1),是原地算法。

这个算法是不稳定的,里面有很多不相邻元素的交换操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值