基本排序方法之四——希尔排序

希尔排序(shell sort)又称缩小增量排序(diminishing increment sort),是希尔于1959年对直接插入排序进行改进后提出来的。

希尔排序的基本思想:首先取一个小于n的整数d1作为第一个增量,把全部记录分为d1个组,所有间隔为d1的记录放在同一个组中,在各组内进行直接插入排序(也可采用冒泡排序等其他排序方法),这样一次分钟排序的过程称为一趟排序;然后取第二个增量d2<d1重复上述的分组和排序,直到所取的增量dm=1,即所有记录放在同一组中进行直接插入排序为止。

希尔排序实质上是一种分组插入排序方法,每趟排序过程中,它不是朱各元素进行比较,而是先将整个待排序记录序列分割成若干个子序列,然后分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。

在希尔排序中,增量序列可以有各种取法,但应该遵循使增量序列中的值没有除1之外的公因子,并且最后一个增量的值必须为1的原则。

希尔排序的C语言实现如下:

/************************ 希尔排序(缩小增量排序) ************************
函数名称:void ShellSort(int a[], int len)
参    数:int a[]---待排序的数据
		  int len---待排序数据的个数,也即数组a的长度
功    能:完成希尔排序(缩小增量排序)
返 回 值:无
说    明:排序好的数据依然存放在数组a中
*************************************************************************/
void ShellSort(int a[], int len)
{
	int i, j, d, temp; // temp为哨兵  d为增量
	for(d=len/2; d>=1; d/=2)  // 增量值有多少个,就进行多少趟排序
	{
		// 当d=1时,下面的二重for循环就是直接插入排序(简单插入排序)
		for(i=d; i<len; i++) // 每趟最多进行len-d次排序
		{
			temp = a[i];  // 将每次待排序的元素复制为哨兵
			for(j=i-d; j>=0&&a[j]>temp; j-=d)  // 从a[i-d]到a[0]逐个与哨兵(a[i])比较,大于哨兵的就后移
				a[j+d] = a[j];				  // 直到遇到小于或等于哨兵的元素或是遇到a[0]
			a[j+d] = temp;  // 将哨兵(也即待排序的元素)插入到第一个小于或等于哨兵元素之后			
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值