插入排序-希尔排序

希尔排序

一、定义

  希尔排序又称缩小增量排序,它也是一种插入排序类方法,但在时间效率较前几种有较大的的改进。

二、具体实现

      先将整个待排记录序列分割成若干个子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。
在这里插入图片描述

void shellInsert(ElementType list[],int dk,int i){//直接插入排序
	ElementType temp;
	temp = list[i];
	int j = i - dk;
	for(; j >= 0 && list[j] > temp; j -= dk)
		list[j + dk] = list[j]; 
	
	list[j + dk] = temp;
}
void shellSort(ElementType list[],int n){

	for(int dk = n / 2;dk > 0; dk = dk / 2){//计算增量
		for(int i = dk;i < n; i++){//确定增量后,从第一组开始,逐个对各组进行直接插入排序。
			shellInsert(list,dk,i);
		}
	}
}

三、分析

      希尔排序的分析是个复杂的问题,因为它的时间是所取“增量"的序列函数,这涉及一些数学上尚未解决的难题。应使增量序列中的值没有除1以外的公因子,并且最后一个增量值必须等于1。

      直接插入排序时间复杂度T(n) = O(n^2),在记录较少、基本有序是效率较高的,但数据量比较大时就不高效了,所以当数据量大,数据无序时就使用希尔排序,这正是希尔排序分割子序列带来的高效之处。

      最佳情况:T(n) = O(nlogn)。最坏情况:T(n) = O(n^2)。平均情况:T(n) = O(nlogn)。希尔排序是不稳定的排序算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值