希尔排序(ShellSort)详解

希尔排序的底层是插入排序,

不了解插入排序的友友可以先看我下面这篇文章:

插入排序详解-CSDN博客

思路

就整体而言,希尔排序不过是多用了几次插入排序,

预排序→插入排序,

预排序的作用是让数组元素更接近于有序,

以缩短最后插入排序的时间,

达到优化插入排序的效果。

预排序走的也是插入排序,

但是元素与元素之间的间隔不是1,而是gap(我们自己定义的,有计算公式),

而且gap会越来越小,

直至gap等于1,

就是正统的插入排序

画个粗略的图让大家理解一下:

下图有11个元素,

gap1=11/3+1=4,

gap2=gap1/3+1=4/3+1=2,

gap3=gap2/3+1=2/3+1=1.

建议大家看图时配合代码一起食用。

代码

cpp 复制代码
void ShellSort(int* arr, int n)
{
	int gap = n;
	while (gap>1)
	{
		gap = gap / 3 + 1;//这条式子可以保证gap最后一定为1,走一遍插入排序

//i<n-gap,即i的最大值为n - gap - 1,保证数组不越界,因为tmep最大取到了arr[end + gap]
		for (int i = 0; i < n - gap; i++)
		{
//下面的框架和思想基本与插入排序一致
			int end = i;
			int temp = arr[end + gap];
			while (end >= 0)
			{
				if (temp < arr[end])
				{
					arr[end + gap] = arr[end];
					end -= gap;
				}
				else
				{
					break;
				}
			}
			arr[end + gap] = temp;
		}
	}
}
相关推荐
偷吃的耗子几秒前
[CNN算法理解]:二、卷积层(从生活实例到技术细节)
算法·cnn·生活
2301_790300962 分钟前
C++与Docker集成开发
开发语言·c++·算法
TracyCoder1232 分钟前
LeetCode Hot100(22/100)——141. 环形链表
算法·leetcode·链表
一起养小猫7 分钟前
Flutter for OpenHarmony 进阶:递归算法与数学证明深度解析
算法·flutter
赛博云推-Twitter热门霸屏工具7 分钟前
Twitter 搜索霸屏的关键词工程方法——从算法理解到赛博云推的系统化执行
算法·twitter·dreamweaver
罗湖老棍子20 分钟前
【区间DP】括号序列:如何求解最长合法子序列?(POJ 2955)
算法·动态规划·区间dp·区间动态规划·端点匹配型
王德博客24 分钟前
【实现常见排序算法】直接插入排序的算法思想
数据结构·算法·排序算法
m0_5648768425 分钟前
分布式训练DP与DDP
人工智能·深度学习·算法
纤纡.26 分钟前
逻辑回归实战进阶:交叉验证与采样技术破解数据痛点(一)
算法·机器学习·逻辑回归
重生之后端学习29 分钟前
146. LRU 缓存
java·数据结构·算法·leetcode·职场和发展