排序(2)(希尔排序)

1.插入排序的时间复杂度:最坏为从1到n的等差数列之和。也就是n的平方,但最好为n

2.希尔排序的思路:

1.预排序(接近有序): 假设gap为一组,总计gap组,对gap组分别插入排序

2.插入排序

3.两种循环思路实现第一步预处理:即将所有数据分成gap组,gap越大大的数越快到后面,小的数越快到前面,gap越小挪动越慢越接近有序gap越大和越小时解决o(n),gap=1时是直接插入排序,并在组内完成插入排序

代码实现:注释部分为另一种循环思路

复制代码
void shellsort(int* a, int n)
{
	int gap=3;
	//for (int j = 0; j < gap; j++)
	//{
	//
	// 	for (int i = j; i < n - gap; i = i + gap)
	for(int i=0;i<n-gap;i++)
		{
			int end = n;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (a[end] > tmp)
				{
					a[end + gap] = a[end];
					end = end - gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;//第一个位置
		}
	//}
	}

以上即为分组插入的思路,而gap的核心写法为:

复制代码
void shellsort(int* a, int n)
{
	int gap=n;
while(gap>1)
	//for (int j = 0; j < gap; j++)
	//{
	//
	// 	
{
gap=gap/3+1;
for (int i = j; i < n - gap; i = i + gap)
	for(int i=0;i<n-gap;i++)
		{
			int end = n;
			int tmp = a[end + gap];
			while (end >= 0)
			{
				if (a[end] > tmp)
				{
					a[end + gap] = a[end];
					end = end - gap;
				}
				else
				{
					break;
				}
			}
			a[end + gap] = tmp;//第一个位置
		}
	//}
	}

}

效果为不断趋近于有序,时复为gap*(1+2+......n/gap),约为log3n到log2n之间

相关推荐
小O的算法实验室1 天前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
‎ദ്ദിᵔ.˛.ᵔ₎1 天前
LIST 的相关知识
数据结构·list
M--Y1 天前
Redis常用数据类型
数据结构·数据库·redis
郭涤生1 天前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿1 天前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz1 天前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能1 天前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****1 天前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能1 天前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能1 天前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数