【C/C++ 02】希尔排序

希尔排序虽然是直接插入排序的升级版本,和插入排序有着相同的特性,即原始数组有序度越高则算法的时间复杂度越低(预排序机制),但是是不稳定排序算法。

为了降低算法的时间复杂度,所以我们需要在排序之前尽可能提高数组的有序度。

希尔排序定义一个间隔变量gap,对待排序数组进行分组,将下标间隔为gap的多个数组分为一组,每次遍历都只对组内数据进行排序,然后降低gap,重复上述分组排序,最后gap==1,便是进行直接插入排序,但此时待排序数组的有序度已经很高了,故最后一次排序的时间复杂度接近于。

gap的取值可以自定义,通常会使用进行取值。

希尔排序的时间复杂度难以精确统计,与gap的取值算法和原始数组的有序性强相关,而我们算法经大量实验研究得希尔排序的时间复杂度为~。

cpp 复制代码
void ShellSort(int* arr, int n)
{
	int gap = n;
	while (gap > 1)
	{
		gap = gap / 3 + 1;
		int i = gap;
		for (; i < n; ++i)		
		{
			int j = i;
			int end = arr[j];
			while (j >= gap && arr[j - gap] > end)
			{
				arr[j] = arr[j - gap];
				j -= gap;
			}
			arr[j] = end;
		}
	}
}
相关推荐
FlightYe3 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频
蹊黎4 小时前
Linux 下用 C 语言实现进度条
linux·c语言·单片机
by209994 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
Rover Ramble5 小时前
C++ 用互斥锁实现读写锁
开发语言·c++
你怎么知道我是队长5 小时前
C++零基础入门第2周:数据类型、运算符与表达式完全指南(附20段可运行代码+避坑清单)
c++
say_fall5 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
雪落漂泊6 小时前
C++算法 滑动窗口篇(下)
开发语言·c++
爱聊灵光的维C6 小时前
从看见世界到重构认知:在视觉与硬件的交汇处,寻找我们这代人的北极星
c语言·物联网·计算机视觉·重构·硬件工程·射频工程
AI+程序员在路上6 小时前
RV1126B 上支持的模型及全流程应用--从CNN及语音到 LLMVLM 与跨平台选型
linux·c语言·人工智能
揽星河..7 小时前
【C语言】扫雷游戏
c语言·算法·游戏