希尔排序算法

希尔排序(缩小增量排序算法):比较次数和移动次数均有改善。主要是利用直接插入排序的最好性质:元素少且基本有序。

希尔排序思想:

  1. 将记录序列分成若干个子序列分别进行直接插入排序

  2. 经过多次调整序列记录已基本有序最后再对记录进行直接插入排序。

具体如下:

  1. 对整个文件,按步长d1分组,组内进行直接插入排序

  2. 取d2<d1(缩小增量),继续以d2为步长排序,直到dt=1(此时进行直接插入排序)为止。

所谓步长 就是两个元素的下标的差值 例如 若步长为 4( 元素下标从 0 1 均可 ), 1 个元素 5 个元素会在一组 一次类推

待排序序列:46, 55, 13, 42, 94, 17, 5, 70

d1= 4:(46, 17, 5, 42, 94, 55, 13, 70)

d2= 2:(5, 17, 13, 42, 46, 55, 94, 70)

d3= 1:(5, 13, 17, 42, 46, 55, 70, 94)

distance=4 46,17,5,42,94,55,13,70,

distance=2 5,17,13,42,46,55,94,70,

distance=1 5,13,17,42,46,55,70,94,

证明希尔排序的性能需要用到逆转数的概念。

时间复杂度:O(n1.5)。

稳定性:不稳定,举一个反例即可。例如:(2, 4, 1, 2)

希尔排序的java代码实现如下:

java 复制代码
public class ShellSort {
	public static void shellSort(int[] sourceArray) {
		int len = sourceArray.length;
		// 起始增量(步长)
		int distance = len / 2;
		while (distance >= 1) {
			// 本次增量情况下的循环组数,每一组进行直接插入排序
			for (int groupidx = 0; groupidx < distance; groupidx++) {
				// 组内进行直接插入排序
				for (int idx = groupidx + distance; idx < len; idx += distance) {
					// 正在遍历的元素
					int monitor = sourceArray[idx];
					/* while循环寻找每一组的插入位置 */
					// 索引j表示每一组到这个位置都是排好序的
					int j = idx - distance;
					while ((j >= 0) && (sourceArray[j] > monitor)) {
						// 移动元素
						sourceArray[j + distance] = sourceArray[j];
						j -= distance;
					}
					sourceArray[j + distance] = monitor;
				}
			}
			// 增量缩小
			distance /= 2;
		}
	}

	public static void main(String[] args) {
		// int[] sourceArray = { 46, 55, 13, 42, 94, 17, 5, 70 };
		int[] sourceArray = { 19, 2, 3, 6, 1, 8, 13 };
		shellSort(sourceArray);
		for (int tmp : sourceArray) {
			System.out.print(tmp + " ");
		}
	}
}
相关推荐
cxr8285 分钟前
第16章 跨域迁移与能力融合——从专家到通才
人工智能·算法·智能体·hermes
学究天人12 分钟前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(补充卷9)
人工智能·线性代数·算法·数学建模·动态规划·原型模式·抽象代数
Keven_1119 分钟前
算法札记:图的存储方式
算法·图论
斯文的八宝粥28 分钟前
SERL:让真机强化学习从“难用”走向“可复现”的强化学习框架 ----(4)算法篇(DrQ vs VICE)
算法
yangdaxiageo37 分钟前
算法时代的“心智置顶“:《功夫女足》如何构建GEO正向飞轮
人工智能·科技·算法·aigc
ysa0510301 小时前
【板子】欧拉序
c++·笔记·算法·深度优先·图论
大耳朵糊涂1 小时前
链表的基础操作(二)
算法
拂拉氏1 小时前
【知识讲解】 红黑树的删除讲解
数据结构·算法·红黑树
初学者,亦行者1 小时前
算法设计与分析:动态规划 - TSP问题和0-1背包问题
c++·算法·动态规划
ward RINL1 小时前
# GPT-5.6-sol vs GPT-5.5 新题实测:非弹性碰撞物理题和稳定路由算法
网络·gpt·算法