希尔排序其实是直接插入排序的一个改进,书本上说是众多排序算法中的第一批突破时间复杂度O(N2)的排序算法。
希尔排序的算法时间稳定,较快排来说,快排的最快时间复杂度是 O(nlogn),最快比希尔快,最慢比希尔慢。所以如果数据可能会比较差的话,用希尔可能要比快排更加好。
希尔排序的核心思想就是在直接插入排序的基础上设置一个增量d = n / 2,然后每次比较间隔为d的数据而不是直接插入排序的 ,间隔为1. d = d / 2;一直到d = 1 为止。代码是在直接插入排序上修改即可。
#include <cstdio>
#include <iostream>
using namespace std;
int a[10005];
int n;
void shellsort()
{
int d = n / 2; //初始增量
while(d >= 1) //最外层的判断条件
{
for(int i = d+1; i <= n; i++)
{
int temp = a[i];
int j = i - d; //直接插入排序时d = 1
while(j > 0 && a[j] > temp)//同直接插入排序
{
a[j+d] = a[j];
j = j - d;
}
a[j+d] = temp;
}
d = d / 2;
}
}
int main()
{
cin>>n;
for(int i = 1; i <= n; i++)
cin>>a[i];
shellsort();
for(int i = 1; i <= n; i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}