【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;
		}
	}
}
相关推荐
郝学胜-神的一滴16 小时前
使用Qt OpenGL开发俄罗斯方块:从零到一实现经典游戏
c++·qt·程序人生·游戏·设计模式·系统架构·图形渲染
Elnaij17 小时前
从C++开始的编程生活(15)——模板知识补充
开发语言·c++
cccyi717 小时前
高级I/O编程:从Select、Poll到Epoll的演进与Reactor服务器实现
服务器·c++·reactor
Elnaij17 小时前
从C++开始的编程生活(16)——继承
开发语言·c++
纵有疾風起17 小时前
【C++11深度解析(2)】从新增类功能到智能指针的现代 C++ 核心新特性
开发语言·c++·经验分享·开源
沧澜sincerely17 小时前
蓝桥杯103 日期问题
c++·蓝桥杯
qs701617 小时前
c直接调用FFmpeg命令无法执行问题
c语言·开发语言·ffmpeg
xiaolongmeiya17 小时前
P3810 【模板】三维偏序 / 陌上花开 cdq分治+树状数组
c++·算法
Chrikk17 小时前
基于 RAII 的分布式通信资源管理:NCCL 库的 C++ 封装
开发语言·c++·分布式
阿沁QWQ17 小时前
C++哈希表设计
开发语言·c++·散列表