//不稳定 O(N^2)
//一趟Hk排序就是对Hk个独立的子数组执行一次插入排序
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
void ShellSort(int array[],int n){
int increament;
int temp;
int i,j;
for(increament=n/2;increament>0;increament/=2){
for(i=increament;i<n;i++){
temp=array[i];
for(j=i;j-increament>=0&&array[j-increament]>temp;j-=increament)
array[j]=array[j-increament];
array[j]=temp;
}
}
}
int main(){
int n;
cin>>n;
int array[n];
for(int i=0;i<n;i++)
cin>>array[i];
ShellSort(array,n);
for(int i=0;i<n;i++)
cout<<array[i]<<(i==n-1?'\n':' ');
return 0;
}
//对于趟Hk排序就是对Hk个独立的子数组执行一次插入排序 下面是更明显的代码,但是复杂度高
void ShellSort(int array[],int n){
int increament;
int temp;
int i,j,x;
for(increament=n/2;increament>0;increament/=2){//增量变化
for(i=0;i<increament;i++){//Hk个独立插入排序 的 起点
for(j=i+increament;j<n;j+=increament){
temp=array[j];
for(x=j-increament;x>=0;x-=increament){
if(array[x]>temp)
array[x+increament]=array[x];
else
break;
}
array[x+increament]=temp;
}
}
}
}