希尔排序,相对于冒泡排序来说时间复杂度要低一点,同时要稳定得多。
解析,希尔排序是比较简单的也就是增加一个shell增量,下面代码中的d,d的初始值为5,之后分别为2,1,如果a[5]<a[0],则直接交换,a[10]<a[5]也直接交换,接着就是每次增2,直至增1,这样的好处在于减少了交换次数,降低了时间复杂度。
#include <stdio.h>
#include <time.h>
void Shell(int a[],int len)
{
int n,j,i,d,tmp;
n=5;
for(d=n/2;d>0;d/=2)
{
for(i=d;i<len;i+=d)
{
tmp=a[i];
for(j=i;a[j-d]>tmp&&j>=d;j-=d)//这里要把j>=d提前,不然会导致数组越界。
{
a[j]=a[j-d];
}
a[j]=tmp;
}
}
}
void Print(int a[],int len)
{
for(int i=0;i<len;i++)
{
printf("%d->",a[i]);
}
}
int main()
{
int a[]={5,78,432,456,1223,4,12,4,1,78,432,456,1223,4,156,78,12,4,3,9,};
int len=sizeof(a)/sizeof(a[0]);
Shell(a,len);
Print(a,len);
}