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

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

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

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

gap的取值可以自定义,通常会使用gap = n / 3 + 1进行取值。

希尔排序的时间复杂度难以精确统计,与gap的取值算法和原始数组的有序性强相关,而我们gap = n / 3 + 1算法经大量实验研究得希尔排序的时间复杂度为O(n^{1.25})~O(1.6n^{1.25})

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;
		}
	}
}

相关推荐

  1. python排序

    2024-01-31 00:28:04       53 阅读
  2. c++排序

    2024-01-31 00:28:04       41 阅读
  3. 排序算法——排序

    2024-01-31 00:28:04       70 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-31 00:28:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-31 00:28:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-31 00:28:04       87 阅读
  4. Python语言-面向对象

    2024-01-31 00:28:04       96 阅读

热门阅读

  1. Mysql学习笔记第七章—事务

    2024-01-31 00:28:04       50 阅读
  2. Spring WebSocket实现实时通信

    2024-01-31 00:28:04       56 阅读
  3. springboot请求406、500问题

    2024-01-31 00:28:04       58 阅读
  4. DC-证书颁发机构(23国赛真题)

    2024-01-31 00:28:04       52 阅读
  5. 多语言游戏网站

    2024-01-31 00:28:04       71 阅读
  6. Bean

    2024-01-31 00:28:04       54 阅读
  7. 20240129 大模型快讯

    2024-01-31 00:28:04       66 阅读
  8. Vue2 悬浮球

    2024-01-31 00:28:04       54 阅读
  9. Springboot整合mqtt采用注解进行监听(第二篇)

    2024-01-31 00:28:04       68 阅读
  10. 2.1写一个梅林dynv6插件(上)

    2024-01-31 00:28:04       71 阅读
  11. 为什么Vue3双向绑定使用Proxy

    2024-01-31 00:28:04       71 阅读
  12. 飞往前端的第二天

    2024-01-31 00:28:04       50 阅读
  13. SpringMVC初始化源码学习

    2024-01-31 00:28:04       51 阅读