希尔排序:突破插入排序的局限

embedded/2025/2/27 3:50:58/

大家好!今天我们要介绍的是一种改进的插入算法>排序算法——希尔排序(Shell Sort)。希尔排序通过“分组插入”的方式,突破了传统插入排序的局限性,大大提高了排序效率。虽然它不是最理想的算法>排序算法,但由于简单且高效,尤其在处理部分有序的数据时,表现得非常不错。

一、希尔排序的基本思想

希尔排序是由计算机科学家 Donald Shell 在 1959 年提出的。希尔排序的基本思想是:首先将数组分成若干个小组,然后对每个小组分别进行插入排序。随着排序的进行,逐渐减少小组的数量,直到整个数组只剩下一个小组,最终完成排序。

关键点:
  1. 分组插入:希尔排序的核心在于通过将数组元素按间隔分组来改进插入排序。插入排序的时间复杂度是 O(n^2),但是通过将元素分组并在较大的间隔下进行插入排序,可以显著减少元素的“逆序”,从而提升排序的效率。

  2. 间隔逐渐缩小:希尔排序通过不断减小分组的间隔,逐渐进行多轮插入排序。在开始时,间隔较大,可以减少大范围的交换;随着间隔变小,最终进行一次常规的插入排序。

  3. 优化插入排序:普通的插入排序在面对无序数据时,通常会执行很多交换操作,而希尔排序通过在较大间隔下进行插入排序,逐步减少数据的不一致性,减少了最终插入排序的工作量。

二、希尔排序的步骤

  1. 选择一个间隔序列:选择一个适当的间隔序列(称为增量序列),并用它来分组。常见的增量序列有:初始增量为 n/2,然后每次除以 2;或者使用更为复杂的序列,如 3k + 1 等。

  2. 分组排序:使用当前的增量分组,对每个小组进行插入排序。每一轮排序结束后,逐步减少增量,重复分组排序过程。

  3. 最终排序:当增量为 1 时,执行最后一次插入排序,完成整个数组的排序。

三、希尔排序的实现

下面是用 Java 实现的希尔排序:

public class ShellSort {// 主函数,执行希尔排序public static void shellSort(int[] arr) {int n = arr.length;// 初始增量为数组长度的一半for (int gap = n / 2; gap > 0; gap /= 2) {// 对每个间隔进行插入排序for (int i = gap; i < n; i++) {int temp = arr[i];int j = i;// 插入排序过程while (j >= gap && arr[j - gap] > temp) {arr[j] = arr[j - gap];j -= gap;}arr[j] = temp;}}}// 打印数组public static void printArray(int[] arr) {for (int num : arr) {System.out.print(num + " ");}System.out.println();}public static void main(String[] args) {int[] arr = { 12, 34, 54, 2, 3 };System.out.println("原始数组:");printArray(arr);shellSort(arr);System.out.println("排序后的数组:");printArray(arr);}
}

四、代码解析

  1. shellSort 函数:这是希尔排序的主函数。首先计算出初始的增量 gap,然后通过循环不断缩小 gap 的值。在每一轮的排序中,我们使用插入排序对数组中的元素进行调整。每次将元素按 gap 间隔分成不同的小组,对每个小组内部的元素进行排序。

  2. 插入排序过程:与普通插入排序类似,元素 arr[i] 会与前面按 gap 间隔的元素进行比较,如果发现元素较小,则交换它们的位置。逐渐将元素“插入”到正确的位置。

  3. printArray 函数:用于打印数组,方便查看排序前后的数组。

五、希尔排序的时间复杂度

希尔排序的时间复杂度与增量序列的选择有关。常见的增量序列有几种,其中最简单的选择是每次将增量缩小为一半(即 gap = n / 2, n / 4, n / 8, ...),这种情况下的时间复杂度为 O(n^2)

然而,通过使用更优化的增量序列(例如 3k + 1),时间复杂度可以显著降低。在最优情况下,希尔排序的时间复杂度接近 O(n log n),但由于增量序列的影响,实际表现的时间复杂度较难给出确切值,通常在 O(n log n)O(n^2) 之间。

六、希尔排序的优缺点

优点:
  1. 比插入排序更高效:希尔排序比传统的插入排序更高效,尤其在处理大量数据时,能够显著提高排序速度。
  2. 原地排序:与归并排序等需要额外空间的算法>排序算法不同,希尔排序是一个原地算法>排序算法,空间复杂度为 O(1)
  3. 简洁易实现:希尔排序的实现非常简单,且可以通过不断优化增量序列来提升性能。
缺点:
  1. 不稳定排序:希尔排序是一个不稳定算法>排序算法,意味着相等的元素在排序后可能会改变顺序。
  2. 时间复杂度不稳定:由于增量序列的选择不同,希尔排序的最坏时间复杂度为 O(n^2),最佳时间复杂度为 O(n log n),因此在某些情况下表现可能不如其他高效算法>排序算法(如快速排序)。

七、希尔排序的应用场景

希尔排序适用于以下几种场景:

  1. 大部分有序的数组:当数据已经部分有序时,希尔排序比其他简单算法>排序算法(如插入排序)更加高效。
  2. 中等规模的数据:对于较小的数据集,插入排序等简单算法可能就足够了,而希尔排序作为一种改进型插入算法>排序算法,适合用于处理中等规模的数据。
  3. 空间限制的应用:由于希尔排序是原地算法>排序算法,适合用于空间有限的环境。

http://www.ppmy.cn/embedded/167434.html

相关文章

C++和OpenGL实现3D游戏编程【连载23】——几何着色器和法线可视化

欢迎来到zhooyu的C++和OpenGL游戏专栏,专栏连载的所有精彩内容目录详见下边链接: 🔥C++和OpenGL实现3D游戏编程【总览】 1、本节实现的内容 上一节课,我们在Blend软件中导出经纬球模型时,遇到了经纬球法线导致我们在游戏中模型光照显示问题,我们在Blender软件中可以通过…

DAV_postgresql_1

本节开始&#xff0c;进行postgresql数据库的再次熟悉与探索&#xff0c;先从基本的温故吧&#xff1b; psql \l \dt 显示表 当不清楚命令使用时候&#xff0c;使用如下 \? \help ; postgres# \? General \copyright show PostgreSQL usage and distribution terms \crosst…

【博资考3】网安学院-北航网安基础部分(详细版本)

【博资考3】网安学院-北航网安基础部分 写在最前面北航网安学院考纲&#xff08;三&#xff09;详细1. **单钥密码体制**&#xff08;1&#xff09;密码体制的定义&#xff08;2&#xff09;古典密码&#xff08;3&#xff09;对称密码的主要概念&#xff0c;分组密码的常见结构…

MinIO Go 客户端 API

MinIO 是一个基于 Apache License v2.0 开源协议的对象存储服务&#xff0c;与 Amazon S3 云存储服务兼容&#xff0c;适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器 / 虚拟机镜像等。在 Go 语言中&#xff0c;可以使用 MinIO 官方提供…

防火墙各项指标代表什么意思

防火墙常见指标配置及其含义解析 1. 源地址对象&#xff08;Source Address&#xff09; 含义&#xff1a;流量的来源IP地址或IP地址范围。作用&#xff1a;定义哪些IP地址或网络段的流量可以被允许或拒绝。示例&#xff1a; 单个IP&#xff1a;192.168.1.1IP范围&#xff1a;…

【力扣】2506:统计相似字符串对的数目

【力扣算法】2506&#xff1a;统计相似字符串对的数目 题目&#xff1a; 给你一个下标从 0 开始的字符串数组 words 。 如果两个字符串由相同的字符组成&#xff0c;则认为这两个字符串 相似 。 例如&#xff0c;"abca" 和 "cba" 相似&#xff0c;因为…

鸿蒙实战篇-解决报错提示“code:9568305 error: dependent module does not exist”

大家好&#xff0c;这里是鸿蒙开天组&#xff0c;好久不见了&#xff0c;前段时间比较忙&#xff0c;所以没怎么发过文&#xff0c;今天咱们先来个过年后的好头&#xff0c;发一篇简单又实用的实战文吧&#xff01; 一、问题现象&#xff1a; 相信有部分可能都遇到过这么一个…

一周学会Flask3 Python Web开发-Jinja2模板访问对象

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 如果渲染模板传的是对象&#xff0c;如果如何来访问呢&#xff1f; 我们看下下面示例&#xff1a; 定义一个Student类 cla…