希尔排序-排序算法

前言

希尔排序固然很好,但是某些情况下,有很多缺点。例如下面这种情况:

9 之前的元素都已经有序,只有元素 1 和 2 的位置不对,使用插入排序几乎要移动整个数组的元素,效率很低。

这时候希尔排序横空出世,为的就是应对这种情况,希尔排序(ShellSort)是希尔提出的一种排序算法,它也是插入排序的一种,是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,也就是它会优先比较距离较远的元素。

希尔排序是把记录按一定的增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的元素越来越多,当增量减至1时,所有元素被分成一组,实际上等同于执行一次上面讲过的插入排序,算法便终止。

从上面这一段话中,你可能不知道什么是增量,增量怎么选取,如何分组。接下来看看具体步骤。(学习希尔排序前最好是已经知道插入排序)

步骤

这是原始的数组,颜色相同的为一组。

初始增量 gap = length / 2 = 5 ,所以我们要分为 5 组,分别是:【8,3】【9,5】【1,4】【7,6】【2,0】

对这 5 组分别进行直接插入排序,如下图,可以看到,较小的元素移动到了前面。然后缩小增量 gap = gap / 2 = 2,那么要分为两组.

对上面两组再分别进行直接插入排序,下图可以看到,此时整个数组的有序程度更近一步啦,再缩小增量 gap = gap / 2 = 1 ,整个数组被分为一组。

经过上面的"调整",此时再也不像刚开始时:需要大量移动元素。对上面一组进行一趟插入排序,就可得到有序序列,增量再次减小 gap = gap / 2 = 0,此时停止。

这就是整个过程,其中需要对插入排序的过程十分了解才行,接下来直接撸代码。

代码

复制代码
#include <iostream>
using namespace std;

void ShellSort(int arr[], int left, int right)
{
	int gap = (right - left + 1) / 2; //初始增量设为长度的一半


	for (; gap > 0; gap = gap /2) 
	{
		for (int i = gap; i <= right; i++) //对每一个数在其分组进行插入排序
		{
			int current = arr[i];
			int j = i - gap; 
			while (j >= 0 && arr[j] > current)
			{
				arr[j + gap] = arr[j];
				j -= gap;
			}
			arr[j + gap] = current;

		}
	}

}

int main(void)
{

	int arr[] = { 3,4,5,6,7,8,9,10,1,2 };
	int len = sizeof(arr) / sizeof(arr[0]);

	ShellSort(arr, 0, len - 1);

	for (int i = 0; i < len; i++)
	{
		cout << arr[i] << " ";
	}

	return 0;
}

如果上面的代码看不懂,可以结合过程推导

相关推荐
youtootech14 小时前
HarmonyOS《柚兔学伴》项目实战09-待办列表 UI——List+ForEach+滑动删除
数据结构·ui·华为·list·harmonyos
:-)15 小时前
算法-归并排序
java·开发语言·数据结构·算法·排序算法
Jerry19 小时前
LeetCode 101. 对称二叉树
算法
可编程芯片开发20 小时前
基于MPPT最大功率跟踪的离网光伏发电系统Simulink建模与仿真
算法
AI科技星20 小时前
线性算子不是空间映射函数,是全域双螺旋场之间拉伸、旋转、耦合、坍缩的跨空间标准化变换载体《全域数学vs传统数学:人类文明进阶200讲》第80讲
线性代数·算法·矩阵·数据挖掘·回归·乖乖数学·全域数学
米罗篮20 小时前
矩阵快速幂 (Exponentiation By Squaring Applied To Matrices)
c++·线性代数·算法·矩阵
dream_home840721 小时前
图像算法模型NPU适配与算法服务实战指南
人工智能·python·算法·npu 图像服务
大鱼>21 小时前
多宠物家庭智能管理平台:云端架构与多设备协同实战
python·算法·iot·宠物
To_OC1 天前
LC 22 括号生成:刷完这道题,我终于搞懂回溯剪枝了
javascript·算法·leetcode
To_OC1 天前
LC 39 组合总和:回溯入门必刷题,我踩过的两个坑都在这了
javascript·算法·leetcode