希尔排序

6 篇文章 0 订阅

希尔排序

1、简介

希尔排序(Shell Sort),也称为递减增量排序算法,是插入排序的一种高速而稳定的改进版本。希尔排序是基于插入排序的以下两点性质而提出改进方法的:
1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
2.但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位。

2、代码

代码如下:

template<class T>
int ShellSort(T *aArray, int aCount)
{
	if(0 == aCount || NULL == aArray)
		return sERROR;
	
	for(int gap = aCount/2; gap > 0; gap/=2)	//先两个数值排序,然后倍量处理
	{
		for(int i = gap; i < aCount; i++)		//gap所在的组,进行直接插入排序
		{
			int j = i;
			T temp = aArray[j];
			if(aArray[j] < aArray[j - gap])
			{
				while(j - gap >= 0 && aArray[j - gap] > aArray[j])
				{
					aArray[j - gap] = aArray[j - gap] + aArray[j];		//交换
					aArray[j]       = aArray[j - gap] - aArray[j];
					aArray[j - gap] = aArray[j - gap] - aArray[j];
					j = j - gap;
				}	
			}
			aArray[j] = temp;
		}
		
	}
	return sSUCCESS;
}

1.先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中,在各组内进行直接插入排序。
2.取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。

3、引用

使用方法如下:

int main(int argc, char ** argv)
{
	int iArray[] = { 49,38,65,97,76,13,27,49,10 };
	int iSize = sizeof(iArray) / sizeof(int);
	
	cout <<"排序前:"<<endl;
	PrintArray<int>(iArray, iSize);
	
	ShellSort<int>(iArray, iSize);
	
	cout <<"排序后:"<<endl;
	PrintArray<int>(iArray, iSize);
	
	double dArray[] = { 12.3,90.0,123.44,22.5,99.4,34.6,23.3,78.5,20.0 };
	int dSize = sizeof(dArray) / sizeof(double);
	
	cout <<"排序前:"<<endl;
	PrintArray<double>(dArray, dSize);
	
	ShellSort<double>(dArray, dSize);
	
	cout <<"排序后:"<<endl;
	PrintArray<double>(dArray, dSize);
	
	return sSUCCESS;
}

1、第一部分为int类型的数组排序。
2、第二部分位double类型的数组排序。

4、运行结果

在这里插入图片描述

5、总结

1、步长的选择是希尔排序的重要部分。只要最终步长为1任何步长串行都可以工作。算法最开始以一定的步长进行排序。然后会继续以一定步长进行排序,最终算法以步长为1进行排序。当步长为1时,算法变为插入排序,这就保证了数据一定会被排序。
2、平均时间复杂度:O(nlogn)
3、稳定性:不稳定

6、git地址如下

https://github.com/FengAfra/WorkSpace/tree/dev/Arithmetic/ShellSort

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值