数据结构与算法——希尔排序(引例、希尔增量序列、原始希尔排序、代码、时间复杂度、Hibbard增量序列、Sedgewick增量序列)

news2024/11/14 20:16:45

目录

引例

希尔增量序列

原始希尔排序

代码(C语言)

时间复杂度

更多增量序列

Hibbard增量序列

Sedgewick增量序列


希尔排序(by Donald Shell)

引例

给以下序列进行排序:

 先以5的间隔进行插入排序:

 再以3的间隔进行插入排序:

最后再以1为间隔做插入排序,即常规插入排序 ,得到排序完成的序列:

希尔增量序列

  • 定义增量序列D_M>D_{M-1}>...>D_1=1
  • 对每个D_k进行“D_k-间隔”排序(k=M,M-1,..,1) 

注意:D_k-间隔”有序的序列,在执行“D_{k-1}-间隔”排序后,仍然是“D_k-间隔”有序的。

原始希尔排序

D_M=\left \lfloor N/2 \right \rfloor,D_k=\left \lfloor D_{k+1}/2 \right \rfloor

代码(C语言)

希尔排序在插入排序的基础上进行改进

void Shell_Sort(ElementType A[], int N)
{
    for(D = N / 2; D > 0; D /= 2 )  //原始希尔增量序列
    {
        for(P = D; P < N; P++)   //插入排序
        {
            Tmp = A[P];
            for(i = P; i >= D && A[i-D] > Tmp; i -= D)
                A[i] = A[i-D];
            A[i] = Tmp;
        }
    }
}

时间复杂度

最坏情况:T=\Theta (N^2)

O表示上界,\Omega表示下界,\Theta即表示上界也表示下界,为正常值。)

原始希尔序列并不好用,我们举下面的例子:

可以发现,8、4、2间隔的插入排序并没有给序列成功排序,最后还是通过间隔1来完成排序的功能。

有结论:

增量元素不互质,则小增量可能根本不起作用。 

更多增量序列

Hibbard增量序列

  • D_k=2^k-1——相邻元素互质
  • 最坏情况:T=\Theta (N^{\frac{3}{2}})
  • 猜想:T_{avg}=O(N^{\frac{5}{4}})

Sedgewick增量序列

  • { 1,5,19,41,109,...}—— 9\times4^i-9\times2^i+14^i-3\times2^i+1
  • 猜想:T_{avg}=O(N^{\frac{7}{6}}),T_{worst}=O(N^{\frac{4}{3}})
void ShellSort( ElementType A[], int N )
{ /* 希尔排序 - 用Sedgewick增量序列 */
     int Si, D, P, i;
     ElementType Tmp;
     /* 这里只列出一小部分增量 */
     int Sedgewick[] = {929, 505, 209, 109, 41, 19, 5, 1, 0};
     
     for ( Si=0; Sedgewick[Si]>=N; Si++ ) 
         ; /* 初始的增量Sedgewick[Si]不能超过待排序列长度 */

     for ( D=Sedgewick[Si]; D>0; D=Sedgewick[++Si] )
         for ( P=D; P<N; P++ ) { /* 插入排序*/
             Tmp = A[P];
             for ( i=P; i>=D && A[i-D]>Tmp; i-=D )
                 A[i] = A[i-D];
             A[i] = Tmp;
         }
}

end


学习自:MOOC数据结构——陈越、何钦铭

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/758977.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自学数据结构和算法(5)

二叉树的遍历 分为先序、中序、和后序遍历。 这三种遍历都可以由递归序来得到&#xff1a; &#xff08;1&#xff09;先序遍历&#xff08;也是二叉树的深度优先遍历&#xff09;是第一次到某个结点才打印&#xff1b; &#xff08;2&#xff09;中序遍历是第二次到某个结…

【ACM】—蓝桥杯大一暑期集训Day3

&#x1f680;欢迎来到本文&#x1f680; &#x1f349;个人简介&#xff1a;陈童学哦&#xff0c;目前正在学习C/C、Java、算法等方向&#xff0c;一个正在慢慢前行的普通人。 &#x1f3c0;系列专栏&#xff1a;陈童学的日记 &#x1f4a1;其他专栏&#xff1a;CSTL&#xff…

PCL 获取点集中距离最近的两个点(二维)

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 给定一个平面上n个点的点集,问题是找出点集中最近的点对。这个问题经常出现在许多应用程序中,例如,在空中交通管制中,监视靠得太近的飞机,因为这可能发生碰撞。这里实现一种方式来获取这两个点,具体计算过程如…

换零钱II:零钱面值动态变化,class方法自动兑换最少零钱(贪心算法)

银行现存零钱面值种类动态变化但数量无限&#xff0c;类方法change()完成指定金额的最少零钱个数兑换。 (本笔记适合学透python基本数据结构&#xff0c;熟悉class的基构造&#xff0c;对类内全局变量有一定认的 coder 翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1…

C++并发编程(4):共享数据的问题、使用互斥量保护共享数据、死锁

在线程间共享数据 参考博客 线程间共享数据——使用互斥量保护共享数据 [c11]多线程编程(四)——死锁(Dead Lock) c多线程之死锁 C 死锁及解决办法 共享数据的问题 设想你有一段时间和朋友合租公寓&#xff0c;公寓只有一个厨房和一个浴室。除非你们的感情格外深厚&#xff0…

KBQA项目-基于豆瓣电影TOP250数据的知识图谱对话机器人

从今天开始&#xff0c;我们要一起来学习一个新的课程&#xff0c;叫做《基于豆瓣电影TOP250数据的知识图谱对话机器人》&#xff0c;同时&#xff0c;这个课程也是「知识图谱」系列的第一个项目。 项目演示 课程内容 1、爬取数据&#xff1a;使用reqests库&#xff0c;结合b…

贝莱德CEO再谈比特币ETF:客户需求让我们进军加密市场

来源&#xff1a;CNBC 编译&#xff1a;WEEX Exchang 「进军加密货币领域符合这家资产管理巨头更广泛的使命&#xff0c;即为投资者创造易用且低成本的产品。」贝莱德 CEO Larry Fink 周五&#xff08;7 月 14 日&#xff09;在 CNBC 「街谈巷议」&#xff08;Squawk on the St…

Java 设计模式——装饰者模式

目录 1.概述2.结构3.案例实现3.1.抽象组件3.2.具体组件3.3.抽象装饰3.4.具体装饰3.5.测试 4.优缺点5.使用场景6.JDK 源码解析——BufferedWriter7.装饰者模式和静态代理的比较 1.概述 &#xff08;1&#xff09;我们先来看一个快餐店的例子&#xff1a;快餐店有炒面、炒饭这些…

PCB板框评估及叠层设计

PCB板框评估及叠层设计 板框评估叠层设计 板框评估 首先选中所有器件&#xff0c;点击下图指令 在PCB中画一个矩形框&#xff0c;所有器件将会排列在这个框中 快捷键 E O S 重新定义原点 选择机械1层&#xff0c;快捷键P L 画出大致的板框&#xff0c;板框画好之后&#x…

全网最详细4W字Flink入门笔记(下)

本文已收录至Github&#xff0c;推荐阅读 &#x1f449; Java随想录 文章目录 Flink State状态CheckPoint & SavePointCheckPoint原理SavePoint原理 StateBackend状态后端MemoryStateBackendFsStateBackendRocksDBStateBackend集群级配置StateBackend Window滚动窗口&#…

从小白到大神之路之学习运维第61天--------Ansible自动化运维工具(playbook配置文件深入了解)

第三阶段基础 时 间&#xff1a;2023年7月14日 参加人&#xff1a;全班人员 内 容&#xff1a; playbook配置文件 目录 playbook配置文件 一、playbook配置文件概念 修改hosts文件 建立playbook配置文件 yml脚本写法注释&#xff1a; 二、Playbook的核心元素 三、…

【动手学深度学习】--06.暂退法Dropout

文章目录 暂退法(Dropout)1.原理1.1动机1.2无偏差的加入噪音1.3使用丢弃法1.4推理中的丢弃法 2.从零实现Dropout2.1定义模型参数2.2定义模型2.3训练和测试 3.简洁实现 暂退法(Dropout) 学习视频&#xff1a;丢弃法【动手学深度学习v2】 官方笔记&#xff1a;暂退法&#xff0…

vue+canvas图片裁切

vuecanvas图片裁切 头像的裁切、图片的一些处理…… vue&#xff1a;路由router、vuex状态管理 组件效果 组件代码&#xff1a; 实现思路 盒子即一张画布&#xff0c;把选择的图片放到画布中进行裁切&#xff0c;按照canvas的一些语法裁切一部分内容。 有一个固定大小的画布&am…

字节有点飘了,现在阿里员工跳槽字节不受待见

上一篇&#xff1a;对不起&#xff0c;实在扛不住了。。。 字节现在厉害了&#xff0c;不愧为宇宙第一大厂。 阿里员工现在跳槽字节被鄙视&#xff0c;阿里经历竟然是减分项。 据某互联网大厂HR发文透漏&#xff1a;现在阿里跳字节真的不受待见&#xff0c;背景是负加成。 他举…

JVM内存结构——前言

前提 1. 认识JVM&#xff0c;什么是JVM 简单来说&#xff0c;就是java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 1.1 JVM &#xff08;java虚拟机&#xff09;的好处 &#xff1a; 一次编写&#xff0c;到处运行的机制 &#xff08;因为java语言是跨…

【SQL应知应会】表分区(三)• MySQL版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 分区表 • MySQL版 前言一、分区表1.非分区表2.分区…

OSS对象存储后端实现+Vue实现图片上传【基于若依管理系统开发】

文章目录 基本介绍术语介绍图片上传方式介绍普通上传用户直传应用服务器签名后直传 OSS对象存储后端实现maven配置文件配置类ServiceController 图片上传前端图片上传组件api页面使用组件组件效果 基本介绍 术语介绍 Bucket&#xff08;存储空间&#xff09;&#xff1a;用于…

基于linux下的高并发服务器开发(第一章)- Linux系统IO函数

05 / Linux系统IO函数 &#xff08;1&#xff09;man 2 open >>打开一个已经存在的文件 int open(const char *pathname, int flags); 参数&#xff1a; pathname:要打开文件路径 - flags:对文件的操作权限设置还有其他的设置 O_RDONLY,O_WRONLY,O_RDWR 这三个设置是互斥…

#systemverilog# 关于关键字 之 event 了解这些够了(二)->和 ->> 区别

在上一篇文章,我们学习了event 的相关语法和举例,清晰的说明了具体场合的使用规则。今天,我们着重看一下 -> 和 ->> 的区别,进而在以后的工作过程种,能为大家带来一些便利。 我们先看 -> : 【-> 正确的用法】: 【-> 不正确的用法】: 可以看出,触…

BaseDexClassLoader加载类流程源码阅读

安卓10 类图 双亲委派机制 Java层 BaseDexClassLoader 没有loadClass实现&#xff0c;继承的是 ClassLoader 实现 路径 libcore\ojluni\src\main\java\java\lang\ClassLoader.java protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFound…