希尔排序本质是直接插入排序:
要点在于:
1、数组分组,组内进行直接插入排序;分组逐渐减少,最后为1,这时数组已经接近有序,再进行直接插入排序的效率就会比一开始直接进行直接插入排序高一些。
2、缺点也是需要进行合理的分组。
#include <stdio.h>
void ShellSort(int a[], int n, int d[], int numOfD)
{
int i,j,k,m,span;
for(m = 0;m<numOfD;m++)//数组分多少个的小组的变化
{
span = d[m];
for(k=0;k<span;k++)//这一次有多少个小组进行比较
{
//小组内进行直接插入排序
for(i=span;i<n;i=i+span)//从小组内的第二个元素开始
{
if(a[i]<a[i-span])
{
int temp=a[i];
for(j=i-span;j>=0&&a[j]>temp;j=j-span)
{
a[j+span]=a[j];
}
a[j+span]=temp;
}
}
}
}
}
int main()
{
int a[]={5,2,1,4,3,56,18,34,76,57,11,95};
int d[]={6,3,1};
int i, n = 12;
ShellSort(a,n,d,3);
for(i=0;i<n;i++){
printf("%d ",a[i]);
}
}