希尔排序(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;
		}
	}
}
相关推荐
Yupureki2 分钟前
《C++实战项目-高并发内存池》8. 最终性能优化与测试
c语言·开发语言·数据结构·c++·算法·性能优化
DeepModel7 分钟前
【概率分布】均匀分布的原理、推导与Python实现
python·算法·概率论
一叶落4388 分钟前
LeetCode 74 | 搜索二维矩阵(C语言版题解)
c语言·数据结构·c++·算法·leetcode·矩阵·动态规划
罗湖老棍子9 分钟前
星际信号塔 —— 单调栈经典应用详解
数据结构·算法·单调栈
iAkuya11 分钟前
(leetcode)力扣100 96.只出现一次的数字(位运算)
算法·leetcode·职场和发展
Tisfy16 分钟前
LeetCode 1622.奇妙序列:懒更新
数学·算法·leetcode·题解·设计
無限進步D16 分钟前
高精度算法 cpp
c++·笔记·算法·入门
qyzm25 分钟前
AtCoder Beginner Contest 449
数据结构·python·算法·贪心算法
liuyao_xianhui25 分钟前
优选算法_判断字符是否唯一_C++
java·开发语言·数据结构·c++·算法·链表
Barkamin26 分钟前
希尔排序的简单实现
数据结构·算法·排序算法