希尔排序算法

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

希尔排序思想:

  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 + " ");
		}
	}
}
相关推荐
BK贝壳8 小时前
bool-hybrid-array 落盘我只认 .bha:用 Create_BHA / Ask_BHA 做布尔数组序列化
数据结构·python·numpy·1024程序员节
企业数字化笔记10 小时前
视频人体姿态怎么做三维可视化?2D关键点、深度局限与技术选型
人工智能·算法·音视频
?abc!11 小时前
(数组)581. 最短无序连续子数组
数据结构·算法·leetcode
小郎君65814 小时前
MPTT树复选框的半选状态:一棵百万节点树从递归到计数器,再到区间覆盖
算法
酌沧14 小时前
MemT让记忆成为模型内生能力
jvm·人工智能·算法
Shimeri14 小时前
越卷越像:我用遗传算法做了个"内卷"实验
算法·three.js·数据可视化·遗传算法·进化算法
Evand J15 小时前
【PMSM例程1】永磁同步电机(PMSM)转速与转子电角度观测算法|基于扩展卡尔曼滤波(EKF)的传感器状态估计与误差。附下载链接
算法·电机·1024程序员节·卡尔曼滤波
guo_wen_qiang15 小时前
二叉树的层序遍历-使用双端队列Deque
算法·leetcode·1024程序员节
爱读书的小胖15 小时前
LeetCode 55 跳跃游戏 C 语言解题分析
c语言·数据结构·算法·leetcode·1024程序员节
CCblandy15 小时前
前缀缓存命中率不靠引擎靠排列:本机仿真 3 轮,易变字段放开头 98.0%→0.0%
人工智能·python·算法·自然语言处理·性能优化