希尔排序是直接插入排序的一种改进(可是我觉得有点冒泡排序的意思),因为插入排序当数列越整齐则越容易进行排序列,而希尔排序就是将数列慢慢的化为更整齐的数列。
每次对间隔为q[i]的数据进行插入排序,不过最后一个q[i]一定是1,因为我是使用的动态数组进行完成的,所以是递增数列。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1001;
void shellsort(int a[],int i,int n); //对间隔为q[i]的子列进行插入排序
void creat(int n); //创造间隔数组,其实只要最后一个是1就可以较高效率地完成排序 ,不过q[i]=3*q[i]+1;是效率较高的一个,复杂度为O(n^1.25)
vector<int>q;
int main()
{
int n,a[maxn];
cin>>n;
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
creat(n);
for(int i=q.size()-1;i>=1;i--)
shellsort(a,i,n);
for(int i=0;i<n-1;i++)
cout<<a[i]<<" ";
cout<<a[n-1]<<endl;
}
void shellsort(int a[],int i,int n)
{
for(int j=q[i];j<n;j++)
{
int k=j-q[i];
if(a[k]>a[j]) swap(a[k],a[j]);
}
}
void creat(int n)
{
for(int i=1;;)
{
if(i>n) break;
else
q.push_back(i),i=3*i+1;
}
}