希尔排序

排序算法之希尔排序(ShellSort)

希尔排序是插入排序的升级,又称为递减增量排序算法,不稳定的排序算法

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

  • 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
  • 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位


以23, 10, 4, 1的步长序列进行希尔排序。

最坏时间复杂度根据步长序列的不同而不同。已知最好的:{\displaystyle O(n\log ^{2}n)}O(n\log^2 n)
最优时间复杂度O(n)
平均时间复杂度根据步长序列的不同而不同。
空间复杂度

#include<stdio.h>
#include<stdlib.h>

//定步长
//各组内插入排序


void ShellSort(int a[],int nlen)
{
	int i,j,k,temp;
	int nGap;
	if(a==NULL ||nlen <=0) return ;
	//定步长
	for(nGap=nlen/2;nGap>=1;nGap/=2)
	{
		for(i=0;i<nGap;i++)
		{
			for(j=i+nGap;j<nlen;j+=nGap)
			{
				k=j-nGap;
				temp=a[j];
				while (a[k] > temp && k>=0)
				{
					a[k+nGap]=a[k];
					k-=nGap;
				}
				a[k+nGap]=temp;
			}
		}
		
	}
}
//-------------代码优化
void ShellSort2(int a[],int nlen)
{
	int i,k,temp;
	int nGap;
	if(a==NULL || nlen <= 0) return ;
	//定步长
	for(nGap=nlen/2;nGap>=1;nGap/=2)
	{
		for(i=nGap;i<nlen;i++)
		{
			//插入排序
			k=i-nGap;  //有序数组最后一个
			temp=a[i]; //无序数组最后一个
			while (a[k]>temp && k>=0)
			{
				a[k+nGap] = a[k]; //有序数组后移
				k-=nGap;  //向前遍历
			}
			a[k+nGap]=temp;
		}
	}
}
int main()
{
	int a[]={2,1,3,4,5,11,7,0,9};
	int n = sizeof(a)/sizeof(a[0]);
	int i=0;
	ShellSort2(a,n);
	for(i=0;i<n;i++)
	{
		printf("%d ",a[i]);
	}
	printf("\n");
	system("pause");
	return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值