栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【排序算法(二)】希尔排序

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【排序算法(二)】希尔排序

希尔排序

将待排序的记录分割成子序列,整体序列是基本有序的,再在这些子序列中进行直接插入排序。
所谓基本有序,就是小的关键字基本在前面,大的基本在后面。
如何将记录分割成子序列:跳跃分割的策略。将相距某个增量的记录组成一个子序列。

希尔排序是基于直接插入排序的以下两点性质而提出的改进方法:
1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。
2.插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。

希尔排序是将待排序的数组元素 按下标的一定增量分组
,分成多个子序列,然后对各个子序列进行直接插入排序算法排序;然后依次缩减增量再进行排序,直到增量为1时,进行最后一次直接插入排序,排序结束。

作者:Promise_Sun 链接:https://www.jianshu.com/p/d730ae586cf3 来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

示例代码:和直接插入排序的区别在于increment增量的设计

void ShellSort(SqList *L){
	int i,j;
	int increment = L->length;
	do {
		increment = increment/3+1;
		for(i=increment+1;ilength;i++){
			if(L->[i][i-increment]){
				L->[0] = L->[i];
				for(j=i-increment;j>0&&L->[j]>L->[0];j-=increment){
					L->[j+increment] = L->[j];
				}
				L->[j+increment] = L->[0];
			}
		}
	}
	while(increment>1);
}

增量序列的选择很关键。增量序列的最后一个值必须是1,才能遍历所有的元素。希尔排序不是稳定的,时间复杂度可以达到O(n^3/2)。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/727468.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号