【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;
		}
	}
}
相关推荐
汉克老师7 分钟前
CSP-S 2026 初赛试题解析(第一部分:选择题(8-15))精讲
c++·csp-s·小学生·学c++编程
_wyt00113 分钟前
洛谷 P10112 [GESP202312 八级] 奖品分配 题解
c++·数学·gesp·八级
朝朝辞暮i37 分钟前
C++ 第 33 课:事件循环——spin() 到底在干什么
开发语言·c++·算法
殷色玫瑰1 小时前
AVL树:从平衡因子到四种旋转的完整实现
c语言·数据结构·c++·算法·visualstudio
进化中的刀盾兽1 小时前
从零实现 C++ AI 大模型接入 SDK(九):LLMManager 统一模型管理与请求路由
c++
会周易的程序员1 小时前
STVM OSAL 层架构设计文档
c++·物联网·嵌入式·虚拟机·iot·软plc·iec61131
.YM.Z2 小时前
C++——【红黑树】原理详解:定义、性质、插入变色与旋转实现
开发语言·c++
沐欣工作室_lvyiyi2 小时前
水文信息检测系统的设计与实现(论文+源码)
c语言·单片机设计·柳州工学院·河南工学院·怀化学院·集美大学·辽宁科技学院
y1su2 小时前
Leetcode 二分模板
java·数据结构·算法·leetcode·排序算法
无名猿2 小时前
constexpr 能力扩张:从 C++11 到 C++20 的编译期计算
c++·性能优化·现代c++·编译期