希尔排序(C++版)

#include <iostream>
#include <vector>
using namespace std;

void print(vector<int>& nums){
    for(auto a: nums){
        cout<<a<<" ";
    }
    cout<<endl;
}

//希尔排序的思想是采用插入排序的方法,
//先让数组中任意间隔为 h 的元素有序,刚开始 h 的大小可以是 h = n / 2,
//接着让 h = n / 4,让 h 一直缩小
//当 h = 1 时,也就是此时数组中任意间隔为1的元素有序,此时的数组就是有序的了。

void shellSortCore(vector<int>& nums,int gap,int i ){
	int inserted=nums[i];
	int j;
	for(j=i-gap;j>=0&&nums[j]>inserted;j-=gap){//  插入的时候按组进行插入
		nums[j+gap]=nums[j];
	}
	nums[j+gap]=inserted;
}

void shellSort(vector<int>& nums){
	int size=nums.size();
	if(size<2) return;

	for(int gap=size/2;gap>=1;gap/=2){//进行分组,最开始的时候,gap为数组长度一半
		for(int i=gap;i<size;i++){    //对各个分组进行插入分组
			shellSortCore(nums,gap,i);//将nums[i]插入到所在分组正确的位置上
		}
	}
}

int main(){
     vector<int> nums{1,24,67,23,4,78,90,456};
     shellSort(nums);
     print(nums);
     return 0;
}

时间复杂度:O(nlog(n)) O(nlog(n)^2) O(nlog(n)^2)
空间复杂度:O(1)
希尔排序是不稳定的

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值