希尔排序法

希尔排序为插入排序的优化,即将数组分组,将每一组进行插入排序,每一组排成有序后,最后整体就变有序了。

上面gap=2,即5,14,18,27,68为一组;13,20,36,39,51为一组。

gap=2,从a2开始,a2和a0进行插入排序,a3和a1插入排序,a4和a2、a0插入排序......

为什么 要采取上面分组的方法呢(gap),换一种方法也可以吗?

例如:
相邻元素分为一组
相邻分组排序之后
按gap分组
gap分组排序之后

可以发现左边都是较小的数据,右边都是较大的数据,更方便把分成的每一个组进行插入排序。

思想:当数据很大的时候,数据的gap设的很大,小的数据会往前放,大的数据会往后放,然后gap逐渐缩小,间隔也会逐渐缩小,整体数据会更加趋于有序,最后用gap=1,此时退化成直接插入排序,这个时候使用直接插入排序效率也会更高。

cpp 复制代码
void Shell(int* arr, int size, int gap)
{
	for (int i = gap; i < size; i++) {
		int tmp = arr[i];
		int j = i - gap;
		for (; j >= 0; j -= gap) {
			if (tmp < arr[j]) {
				arr[j + gap] = arr[j];
			}
			else {
				break;
			}
		}
		arr[j + gap] = tmp;
	}
}
void ShellSort(int* arr, int size)
{
	int gap = size;
	while (gap > 1) {
		// gap组数变换比较随意,gap /= 3也可以
		gap /= 2;
		Shell(arr, size, gap);
	}
	// 最后让gap=1再排序一次,即直接插入排序
	Shell(arr, size, 1);
}
相关推荐
海石2 小时前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石2 小时前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
Jerry4 小时前
LeetCode 151. 反转字符串中的单词
算法
gugucoding5 小时前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表
ChaoZiLL6 小时前
我的数据结构3——链表(link list)
数据结构·链表
a1117767 小时前
LM 算法迭代过程动画演示(SLAM)
算法
头茬韭菜7 小时前
Context 的生死抉择:四层压缩、截断算法与 Session Memory
算法·ai
Jerry7 小时前
LeetCode 541. 反转字符串 II
算法
Jerry7 小时前
LeetCode 344. 反转字符串
算法
搞科研的小刘选手8 小时前
【香港大学主办&IEEE出版】第六届计算机视觉、应用与算法国际学术会议(CVAA 2026)
算法·计算机视觉·应用·学术会议