【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;
		}
	}
}
相关推荐
6***x5452 小时前
C++在计算机视觉中的图像处理
c++·图像处理·计算机视觉·游戏引擎·logback·milvus
fpcc2 小时前
跟我学C++中级篇——内存访问违例
c++
E***q5392 小时前
C++内存对齐优化
开发语言·c++
D_evil__2 小时前
[C++高频精进] 文件IO:文件操作
c++
lingggggaaaa3 小时前
免杀对抗——C2远控篇&PowerShell&有无文件落地&C#参数调用&绕AMSI&ETW&去混淆特征
c语言·开发语言·笔记·学习·安全·microsoft·c#
口袋物联3 小时前
设计模式之建造者模式在 C 语言中的应用(含 Linux 内核实例)
c语言·设计模式·建造者模式
切糕师学AI3 小时前
位带操作(Bit-Banding)是什么?
c语言·arm·嵌入式开发·cortex-m·位带操作
别动哪条鱼3 小时前
MP4转AAC转换器C++
c++·ffmpeg·音视频·aac
2301_807997384 小时前
代码随想录-day47
数据结构·c++·算法·leetcode
李日灐4 小时前
手搓简单 string 库:了解C++ 字符串底层
开发语言·c++