#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)
希尔排序是不稳定的