introduction to algorithms sorting lesson_3 shell sorting

作为插入排序的改进算法  希尔排序 shell sort

基本思想:对于排序数量较少的数据,运用直接插入排序可以很快,效率很高

基于这一点,希尔排序的想法是:将原数据分成若干数据量较少的组,分别进行排序,则这些数据基本有序,最后对全体进行一次插入排序即可。

假设有10数据,如:49  29  30  12   32  59  99  04  95 09  

分组的步骤是:第一趟希尔插入排序,选取间隔为5的数据,则分组为<49  59>   <29,99>  < 30,04>  ,<12 , 95 > <32 ,09>

                            第二趟希尔插入排序,间隔减少为3

                            第三趟希尔插入排序,间隔为1   则完成排序

代码:

/*********shell sorting***********/
#define getArraySize(arrayName) (sizeof(arrayName)/sizeof(arrayName[0]))
void shellinsert(int data[],int len,int dk)
{
	int key;
	int i,j;
	for(i=dk;i<len;i++)   //一次希尔插入排序
	{
		if (data[i]<data[i-dk])
		{
			key=data[i];
			for (j=i-dk;j>=0&&data[j]>key;j-= dk)
			{
				data[j+dk]=data[j];
			}
			data[j+ dk]=key;
		}
	}
}
void shell(int data[],int lda,int dk[],int t)//增量多次希尔插入排序
{
  for(int k=0;k<t;k++)
	  shellinsert(data,lda,dk[k]);
}
测试:

int _tmain(int argc, _TCHAR* argv[])
{
	int data_test[10]={1,0,2,9,3,1,5,8,9,10};
	int dk[3]={5,3,1};
	shell(data_test,getArraySize(data_test),dk,getArraySize(dk));//getArraySize 获取数组长度
	prtarray(data_test,getArraySize(data_test));//打印数组
	system("pause");
	return 0;
}
希尔排序分析:

由于希尔排序与数据本身的排序有复杂的关系,增量序列也难以分析,目前还没有解决希尔排序的严格证明。

数据结构教材:通过实验的方法,希尔排序的时间复杂度 O(n^1.3)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值