JSMS36-希尔排序算法实现

301 阅读1分钟

希尔排序,相对于冒泡排序来说时间复杂度要低一点,同时要稳定得多。

解析,希尔排序是比较简单的也就是增加一个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);

 }