数据结构|排序算法(二) 希尔排序

一、希尔排序

1.算法思想

希尔排序(Shell Sort)是插入排序的一种改进版本,也称为缩小增量排序。

希尔排序的基本思想是将原始数据分成若干个子序列,每个子序列的元素间隔较大,然后对每个子序列进行插入排序。随着排序的进行,逐渐减小子序列的元素间隔,直到间隔为 1,此时整个序列基本有序,再进行一次普通的插入排序即可完成排序

注意:分组时采用间隔式的排序!

希尔排序采用间隔式排序主要有以下原因:

加快元素移动速度:希尔排序将原始数据分成多个子序列,每个子序列的元素间隔较大。这样在排序过程中,元素可以以较大的步长移动,能更快地将元素移动到其最终位置附近。例如,对于一个很大的数组,如果直接进行插入排序,每个元素可能需要移动很多次才能到达最终位置。但希尔排序通过大间隔分组,让元素先进行 "远距离" 的移动,初步将数据大致排序,减少了后续插入排序时元素的移动次数。

改善最坏时间复杂度:传统的插入排序在最坏情况下(如数组完全逆序)时间复杂度为O(n2)

希尔排序通过间隔式排序,使数组在初始阶段就接近有序状态,当间隔逐渐减小时,数组已经基本有序,此时再进行插入排序,就可以避免最坏情况的发生,其平均时间复杂度介于O(n)

到O(n2)之间,通常能达到O(n1.3)左右,性能相比直接插入排序有显著提升。

利用局部有序性:在间隔式排序过程中,每个子序列内部进行排序,使得子序列逐渐变得有序。随着间隔逐渐缩小,子序列的长度逐渐增加,而之前已经排好序的子序列能为后续更大规模的排序提供一定的有序基础,充分利用了数据的局部有序性,提高排序效率。

希尔排序核心思想就是:1 间隔式分组;2 利用直接插入排序使组内有序:越有序越快;3 再缩小分组再排序,直到缩为1组。

2.代码实现

复制代码
//希尔排序
//一趟希尔排序 gap为组数(间隔)
static void Shell(int* arr, int len, int gap)
{
	int tmp, i, j;
	for (i = gap; i < len; i++)//i是当前要处理的数字的下标
	{
		tmp = arr[i];//取出当前要插入的元素
		//遍历已排序的部分
		for (j = i - gap; j >= 0; j-=gap)//从i的前一个开始找位置,从后往前找,找比当前数字小的,同时移动数据
		{
			if (arr[j] > tmp)
			{
				arr[j + gap] = arr[j];//将比tmp大的元素后移gap
			}
			else
			{
				break;
			}
		}
		arr[j + gap] = tmp;//将tmp插入正确位置
	}
}
void ShellSort(int* arr, int len)
{
	int drr[] = { 5,3,1 };//分组数,最后一个组数一定为1
	for (int i = 0; i < sizeof(drr) / sizeof(drr[0]); i++)//循环控制分组的次数,此处分3次(5,3,1)
	{
		Shell(arr, len, drr[i]);//一趟希尔排序
	}
}

3.复杂度分析

希尔排序不稳定。

时间复杂度:希尔排序的时间复杂度与增量序列的选择有关。在最坏情况下,希尔排序的时间复杂度为O(n2)。在最好情况下,希尔排序的时间复杂度为O(nlogn)。

空间复杂度:希尔排序是一种原地排序算法,只需要常数级别的额外空间,因此空间复杂度为

O(1)。

稳定性:希尔排序是不稳定的排序算法。在排序过程中,相同元素的相对位置可能会发生改变。

希尔排序通过将原始数据分成多个子序列,每个子序列的元素间隔较大,使得元素可以更快地移动到其最终位置,从而提高了排序效率。它在处理大规模数据时表现较好,是一种常用的排序算法。

相关推荐
wabs66614 小时前
关于图论【卡码网117.软件构建的思考】
数据结构·算法·软件构建·图论·卡码网
mifengxing15 小时前
LeetCode 41.缺失的第一个正数|Hard题O(n)+O(1)最优解法深度解析
java·算法·leetcode·排序算法
Tongzhi202615 小时前
从部署到运维:通芝科技无感考勤一体机的全流程效率解析
运维·数据结构·科技·算法·贪心算法
Wang's Blog16 小时前
AI Agent白手起家30: 动态示例选择器之根据长度选择 Few Shot 示例
算法
oyguyteggytrrwwwrt17 小时前
自制交叉线路识别算法
算法
手写码匠17 小时前
华为云Flexus+DeepSeek征文|Dify 多智能体协同编排实战:R1 规划 + V3 执行,构建企业 Agent 团队
人工智能·深度学习·算法·aigc
晓天衡宇•评测社区18 小时前
FSR-Bench 前沿科学推理榜单发布:GPT-5.5 居首,“会推理”未必“能答对”
算法
程序喵大人19 小时前
【C++进阶】STL算法与函数对象 - 02 sort为什么需要随机访问迭代器
开发语言·c++·算法
hanlin0320 小时前
动态规划专练:力扣第121、122题
笔记·算法·leetcode
To_OC20 小时前
LC 74 搜索二维矩阵:换皮的二分查找,我居然一开始没看出来
javascript·算法·leetcode