【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;
		}
	}
}
相关推荐
牛油果子哥q2 小时前
C++内存模型与深浅拷贝万字详解:栈堆静态内存布局、深浅拷贝底层差异、内存泄漏根治、拷贝崩溃踩坑、手写深拷贝实战
java·开发语言·c++
大鹏的NLP博客2 小时前
通用 Linux 嵌入式板端 C/C++ ABI 与 Glibc 依赖治理规范
linux·c++·交叉编译
智者知已应修善业3 小时前
【51单片机数码管逐位显示1-8余位不亮】2024-10-23
c语言·经验分享·笔记·嵌入式硬件·51单片机
ysa0510303 小时前
c++常用自带函数用法与注意
c++·笔记·算法
caimouse4 小时前
ReactOS 图形系统分析(47):GDI 批处理 — gdibatch.c
c语言·开发语言
caimouse5 小时前
ReactOS 窗口系统分析(1):窗口对象与创建 — window.c
c语言·开发语言
caimouse5 小时前
ReactOS 图形系统分析(53):系统库存对象 — stockobj.c
c语言·开发语言·spring
caimouse6 小时前
ReactOS 图形系统分析(52):OpenGL 支持 — wingl.c
c语言·开发语言
j7~6 小时前
【C语言】《C语言函数递归完全指南:思想、限制、经典例题(阶乘/斐波那契/青蛙跳台阶/汉诺塔)与迭代优化》
c语言·函数递归·汉诺塔问题·青蛙跳台阶问题·递归与迭代·n的阶乘
鸿芯微控科技7 小时前
MFC模拟量信号异常怎么排查?0-5V、4-20mA接线与量程换算
c++·5g·mfc·故障排查·质量流量控制器·4-20ma·模拟量信号