C++中常用的十大排序方法之4——希尔排序

ops/2025/2/7 21:43:27/

      成长路上不孤单😊😊😊😊😊😊

【😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】

今日分享关于C++中常用的排序方法之4——希尔排序的相关内容!

关于【C++中常用的排序方法之4——希尔排序】

目录:

  • 一、希尔排序的定义
  • 二、希尔排序的发展历史
  • 三、希尔排序的的排序过程
  • 四、希尔排序的基本原理
  • 五、希尔排序的的特点
  • 六、希尔排序的的优点
  • 七、希尔排序的的缺点

希尔排序Shell Sort)

一、希尔排序的定义

希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入算法>排序算法的一种更高效的改进版本。希尔排序是非稳定算法>排序算法。该方法因 D.L.Shell 于 1959 年提出而得名。

希尔排序是把记录按下标的一定增量分组,对每组使用直接插入算法>排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至 1 时,整个文件恰被分成一组,算法便终止。

  

二、希尔排序的发展历史

希尔排序按其设计者希尔(Donald Shell)的名字命名,该算法由希尔在 1959 年所发表的论文“A high-speed sorting procedure” 中所描述。

希尔排序是基于插入排序的以下两点性质而提出改进方法的: 

 1、插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率。

2、但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。

1961年,IBM 公司的女程序员 Marlene Metzner Norton(玛琳·梅茨纳·诺顿)首次使用 FORTRAN 语言编程实现了希尔算法>排序算法。在其程序中使用了一种简易有效的方法设置希尔排序所需的增量序列:第一个增量取待排序记录个数的一半,然后逐次减半,最后一个增量为 1。该算法后来被称为 Shell-Metzner 算法 ,Metzner 本人在2003年的一封电子邮件中说道:“我没有为这种算法做任何事,我的名字不应该出现在算法的名字中。”

三、希尔排序的排序过程

1、缩小增量

希尔排序属于插入类排序,是将整个有序序列分割成若干小的子序列分别进行插入排序

排序过程:先取一个正整数d1数组元素放一组,组内进行直接插入排序;然后取d2

三趟结果

04 13 27 38 49 49 55 65 76 97

2、Shell排序

Shell排序的算法实现:

1. 不设监视哨的算法描述

void ShellPass(SeqList R,int d)

{//希尔排序中的一趟排序,d为当前增量

for(i=d+1;i

if(R[ i ].key

R[0]=R[i];j=i-d; //R[0]只是暂存单元,不是哨兵

do {//查找R的插入位置

R[j+d]=R[j]; //后移记录

j=j-d; //查找前一记录

}while(j>0&&R[0].key

R[j+d]=R[0]; //插入R到正确的位置上

} //endif

该方法实质上是一种分组插入方法

比较相隔较远距离(称为增量)的数,使得数移动时能跨过多个元素,则进行一次比较就可能消除多个元素交换。D.L.shell于1959年在以他名字命名的算法>排序算法中实现了这一思想。算法先将要排序的一组数按某个增量d分成若干组,每组中记录的下标相差d.对每组中全部元素进行排序,然后再用一个较小的增量对它进行分组,在每组中再进行排序。当增量减到1时,整个要排序的数被分成一组,排序完成。

一般的初次取序列的一半为增量,以后每次减半,直到增量为1。

给定实例的shell排序的排序过程

假设待排序文件有10个记录,其关键字分别是:

49,38,65,97,76,13,27,49,55,04。

增量序列的取值依次为:

5,2,1

四、‌希尔排序的基本原理

希尔排序是基于插入排序的一种改进算法。它将整个待排序的记录序列分割成若干子序列,分别进行直接插入排序。然后逐渐减小间隔,再次进行插入排序,直到整个序列变为有序。希尔排序通过分组插入的方式,每次比较相距较远的元素,从而减少了逆序对的数量,提高了排序效率。

五、希尔排序的特点

希尔排序‌是一种高效的算法>排序算法,由美国计算机科学家Donald Shell于1959年提出。它是插入排序的一种改进版本,通过分组插入排序和缩小增量的方式,大幅度减少了逆序对的数量,从而提高了排序效率。以下是希尔排序的主要特点:

 ‌分组插入排序‌:希尔排序将数组分成若干个子序列,每个子序列通过插入排序进行排序。由于子序列的长度较短,插入排序的时间复杂度较低,从而提高了排序效率‌。

缩小增量‌:希尔排序通过逐步缩小增量(通常采用二分法递减增量),将数组分成更小的子序列进行排序。增量最终减小到1时,整个数组进行一次插入排序‌。

大幅度减少逆序对‌:由于希尔排序是通过间隔分组进行插入排序的,每次排序都会将相距较远的元素进行比较和交换,从而大幅度减少了逆序对的数量。逆序对的数量是衡量一个算法>排序算法效率的重要指标,逆序对越少,排序效率越高‌。

非稳定性‌:希尔排序是一种非稳定的算法>排序算法。在排序过程中,相同大小的元素可能会发生交换,导致原来相对顺序的改变。尽管如此,希尔排序在实际应用中并不影响排序结果的正确性‌。

适用场景‌:希尔排序适用于大部分情况,尤其适用于部分有序的数据集。当数据集接近有序时,希尔排序的效率非常高‌。 

六、希尔排序的优点

希尔排序的优点主要包括以下几个方面‌:‌

减少比较次数‌:希尔排序通过分组插入的方式进行排序,每次比较相距较远的元素,从而大幅度减少了逆序对的数量,提高了排序效率。

高效处理大数据量‌:希尔排序在处理大量数据时表现出色,其时间复杂度通常为O(n^1.3),并且空间复杂度为O(1),这意味着它需要的额外空间非常小。

简单易实现‌:希尔排序的实现相对简单,易于理解和编写代码。

适用于大规模数据‌:希尔排序特别适合处理大规模数据,因为它通过分组和逐步减小增量来排序,避免了直接对整个数据集进行排序的时间和空间复杂度过高的问题。

七、希尔排序的缺点

非稳定性‌:希尔排序是一种非稳定的算法>排序算法,可能会改变相同元素的相对顺序。

性能受增量序列影响‌:增量序列的选择对希尔排序的性能有很大影响。如果增量序列选择不当,可能会导致时间复杂度退化为O(n^2)甚至更差。

时间复杂度不确定‌:希尔排序的时间复杂度并不固定,通常认为是O(n^1.3),但最坏情况下可能会更差。

七、插入排序的缺点

插入排序的主要缺点包括以下几个方面‌:

时间复杂度较高‌:插入排序的时间复杂度在最坏的情况下是O(n^2),其中n是待排序元素的数量。这意味着当数据量较大时,插入排序的效率会显著下降,不适合处理大规模数据集‌。

不适用于部分有序的数据‌:虽然插入排序在数据部分有序的情况下表现较好,但如果数据已经接近排序状态,其他算法>排序算法(如归并排序或快速排序)通常会更高效‌。

不稳定‌:插入排序是一种不稳定的算法>排序算法,相同的元素在排序后可能会改变它们原有的顺序。这意味着如果输入数组中有重复的元素,排序后这些元素的相对顺序可能会发生变化‌。

不适合实时应用‌:由于插入排序的时间复杂度较高,它不适合需要快速响应的应用场景,如实时数据处理系统‌。


http://www.ppmy.cn/ops/156547.html

相关文章

设计模式Python版 组合模式

文章目录 前言一、组合模式二、组合模式实现方式三、组合模式示例四、组合模式在Django中的应用 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式…

React中使用箭头函数定义事件处理程序

React中使用箭头函数定义事件处理程序 为什么使用箭头函数?1. 传递动态参数2. 避免闭包问题3. 确保每个方块的事件处理程序是独立的4. 代码可读性和维护性 示例代码总结 在React开发中,处理事件是一个常见的任务。特别是当我们需要传递动态参数时&#x…

(安全防御)防火墙安全策略部署

一.网络拓扑图 二、实验要求 1、VLAN2属于办公区;VLAN3属于生产区 2、办公区PC在工作日时间(周一至周五,早八到晚六)可以正常访问OA server,其他时间不允许 3、办公区pc可以在任意时间可以访问Web server 4、生产区pc…

笔记本电脑屏幕泛白问题解决详解(AMD显卡)

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂,风趣幽默",感觉非常有意思,忍不住分享一下给大家。 👉点击跳转到教程 前言: 本人的电脑是AMD显卡,出现屏幕泛白。 如果没有驱动管理软件…

DeepSeek:全栈开发者视角下的AI革命者

目录​​​​​​​ DeepSeek:全栈开发者视角下的AI革命者 写在前面 一、DeepSeek的诞生与定位 二、DeepSeek技术架构的颠覆性突破 1、解构算力霸权:从MoE架构到内存革命 2、多模态扩展的技术纵深 3、算法范式的升维重构 4、重构AI竞争规则 三、…

二维前缀和:高效求解矩阵区域和问题

在处理二维矩阵时,频繁计算某一子矩阵的和是一个常见的操作。传统的做法是直接遍历该子矩阵,时间复杂度较高。当矩阵非常大且有大量的查询时,直接计算将变得低效。为了提高效率,我们可以通过 二维前缀和 技巧在常数时间内解决这个…

保姆级教程Docker部署Zookeeper官方镜像

目录 1、安装Docker及可视化工具 2、创建挂载目录 3、运行Zookeeper容器 4、Compose运行Zookeeper容器 5、查看Zookeeper运行状态 6、验证Zookeeper是否正常运行 1、安装Docker及可视化工具 Docker及可视化工具的安装可参考:Ubuntu上安装 Docker及可视化管理…

C# 中 Guid类 使用详解

总目录 前言 C# 中的 Guid 类(全局唯一标识符,Globally Unique Identifier)用于生成和操作 128 位的唯一标识符。它在需要唯一标识的场景(如数据库主键、分布式系统等)中广泛使用。 一、什么是 Guid Guid&#xff08…