希尔排序算法

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

希尔排序思想:

  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 + " ");
		}
	}
}
相关推荐
junziruruo2 分钟前
t-SNE可视化降维技术(以FMTrack频率感知与多专家融合文章中的内容为例)
人工智能·算法
藦卡机器人12 分钟前
自动焊接机器人的核心技术要求与标准
人工智能·算法·机器人
2501_9403152629 分钟前
【无标题】1.17给定一个数将其转换为任意一个进制数(用栈的方法)
开发语言·c++·算法
栈与堆31 分钟前
LeetCode 21 - 合并两个有序链表
java·数据结构·python·算法·leetcode·链表·rust
viqjeee39 分钟前
ALSA驱动开发流程
数据结构·驱动开发·b树
鹿角片ljp1 小时前
力扣7.整数反转-从基础到边界条件
算法·leetcode·职场和发展
java修仙传1 小时前
力扣hot100:前K个高频元素
算法·leetcode·职场和发展
嗷嗷哦润橘_2 小时前
从萝卜纸巾猫到桌游:“蒸蚌大开门”的设计平衡之旅
人工智能·算法·游戏·概率论·桌游
XH华2 小时前
数据结构第九章:树的学习(上)
数据结构·学习
TracyCoder1232 小时前
Java String:从内存模型到不可变设计
java·算法·string