插入排序,希尔排序,和归并排序
每一本数据结构和算法的教科书中,都不厌其烦的介绍了排序算法。不厌其烦的介绍10余种不同的排序。那么实际编程中用得到那么多排序算法吗?当然用不到。那么为什么全世界的教科书都这么写呢?显然是醉翁之意不在酒。
数组,是每个编程语言中最基本最简单的数据结构。然而算法书告诉你,只要对它施加任何一种魔法规则,它立刻就分化出无数精细微妙的次结构。而这些次结构的拼装组合,又转化成最简单的数组结构。
直接上代码。注意以下展示的例子,为了揭示基本原理,都没有进行优化。读者可以对照算法书,一步一步观看它的对应的实际代码。因此具体原理这里就省略了。
首先是插入排序:
func insertsort(a[], n)
{for(i=1; i<n; i++) {t =a[i];j=i-1;while(j>=0) {if(a[j]>t) {a[j+1]=a[j];}else {a[j+1]=t;goto inc1;}j--;}a[0]=t;inc1:printa(a[],n);}
}
希尔排序是在插入排序的基础上,先用一些gap对数组预处理。通过这些处理,使插入排序中挪动数组的距离缩短,从而降低开销。如果一上来gap就取1,直接退化成插入排序:
func shellsort(a[], n)
{gap=n;for(gap/=2;gap>0;gap/=2) {for(i=1; i<n; i++) {t =a[i];j=i-gap;while(j>=0) {if(a[j]>t) {a[j+gap]=a[j];}else {break;}j-=gap;}a[j+gap]=t;}printa(a[],n);}
}
归并排序的gap是另一种用法,它通过gap分段,所以它的子数组的元素是挨着的。不像shell排序,子数组是跳开的。这些,正是算法书所告诉你的:你是程序员,每一个量,你都可以动。
func mergesort(a[], n)
{for(gap=1; gap<n; gap+=gap) {print "gap=",gap;m=0; j=0;next:i=j; j=i+gap;if(j>=n) goto copy;igap=i+gap;jgap=j+gap;if(jgap>n) jgap=n;while(i<igap&&j<jgap) {if(a[i]<=a[j]) {b[m++]=a[i++];}else {b[m++]=a[j++];}}if(i<igap){while(i<igap) b[m++]=a[i++];}else {while(j<jgap) b[m++]=a[j++];}if(j<n) goto next;if(m!=n) exception "error", m,n;
copy:copya(a[], b[], n); printa(a[], n);}
}
下面是例子的一点运行结果,感觉用解释程序是要比编译器省一点脑子:
func reset(a[]) {
a[] = {57,13,31, 18, 19, 9, 14, 71, 11,17,69,
7,3,2, 8, 97, 12, 4, 25, 1,21, 93};
}
func printa(array[], n)
{
while(i<n) print array[i++], “\b”;
print “END”;
}
func copya(array[], b[], n)
{
for(i=0; i<n; i++) array[i]=b[i];
}
reset(array[]);
for(i=0; array[i]; i++);
n=i;
insertsort(array[], n);
reset(array[]);
shellsort(array[], n);
reset(array[]);
mergesort(array[], n);
reset(array[]);
for(i=0; array[i]; i++);
n=i;
insertsort(array[], n);
13 57 31 18 19 9 14 71 11 17 69 7 3 2 8 97 12 4 25 1 21 93 END
13 31 57 18 19 9 14 71 11 17 69 7 3 2 8 97 12 4 25 1 21 93 END
13 18 31 57 19 9 14 71 11 17 69 7 3 2 8 97 12 4 25 1 21 93 END
13 18 19 31 57 9 14 71 11 17 69 7 3 2 8 97 12 4 25 1 21 93 END
9 13 18 19 31 57 14 71 11 17 69 7 3 2 8 97 12 4 25 1 21 93 END
9 13 14 18 19 31 57 71 11 17 69 7 3 2 8 97 12 4 25 1 21 93 END
9 13 14 18 19 31 57 71 11 17 69 7 3 2 8 97 12 4 25 1 21 93 END
9 11 13 14 18 19 31 57 71 17 69 7 3 2 8 97 12 4 25 1 21 93 END
9 11 13 14 17 18 19 31 57 71 69 7 3 2 8 97 12 4 25 1 21 93 END
9 11 13 14 17 18 19 31 57 69 71 7 3 2 8 97 12 4 25 1 21 93 END
7 9 11 13 14 17 18 19 31 57 69 71 3 2 8 97 12 4 25 1 21 93 END
3 7 9 11 13 14 17 18 19 31 57 69 71 2 8 97 12 4 25 1 21 93 END
2 3 7 9 11 13 14 17 18 19 31 57 69 71 8 97 12 4 25 1 21 93 END
2 3 7 8 9 11 13 14 17 18 19 31 57 69 71 97 12 4 25 1 21 93 END
2 3 7 8 9 11 13 14 17 18 19 31 57 69 71 97 12 4 25 1 21 93 END
2 3 7 8 9 11 12 13 14 17 18 19 31 57 69 71 97 4 25 1 21 93 END
2 3 4 7 8 9 11 12 13 14 17 18 19 31 57 69 71 97 25 1 21 93 END
2 3 4 7 8 9 11 12 13 14 17 18 19 25 31 57 69 71 97 1 21 93 END
1 2 3 4 7 8 9 11 12 13 14 17 18 19 25 31 57 69 71 97 21 93 END
1 2 3 4 7 8 9 11 12 13 14 17 18 19 21 25 31 57 69 71 97 93 END
1 2 3 4 7 8 9 11 12 13 14 17 18 19 21 25 31 57 69 71 93 97 END
reset(array[]);
shellsort(array[], n);
7 3 2 8 19 9 4 25 1 17 69 57 13 31 18 97 12 14 71 11 21 93 END
7 3 2 1 11 9 4 13 8 17 21 12 14 31 18 69 57 25 71 19 97 93 END
2 1 4 3 7 9 8 12 11 13 14 17 18 19 21 25 57 31 71 69 97 93 END
1 2 3 4 7 8 9 11 12 13 14 17 18 19 21 25 31 57 69 71 93 97 END
reset(array[]);
mergesort(array[], n);
gap= 1
13 57 18 31 9 19 14 71 11 17 7 69 2 3 8 97 4 12 1 25 21 93 END
gap= 2
13 18 31 57 9 14 19 71 7 11 17 69 2 3 8 97 1 4 12 25 21 93 END
gap= 4
9 13 14 18 19 31 57 71 2 3 7 8 11 17 69 97 1 4 12 21 25 93 END
gap= 8
2 3 7 8 9 11 13 14 17 18 19 31 57 69 71 97 1 4 12 21 25 93 END
gap= 16
1 2 3 4 7 8 9 11 12 13 14 17 18 19 21 25 31 57 69 71 93 97 END
相关文章:
插入排序,希尔排序,和归并排序
每一本数据结构和算法的教科书中,都不厌其烦的介绍了排序算法。不厌其烦的介绍10余种不同的排序。那么实际编程中用得到那么多排序算法吗?当然用不到。那么为什么全世界的教科书都这么写呢?显然是醉翁之意不在酒。 数组,是每个编…...
Prompt 模版解析:诗人角色的创意引导与实践
Prompt 模版解析:诗人角色的创意引导与实践 Prompt 模版作为一种结构化工具,旨在为特定角色——本例中的“诗人”——提供明确的指导和框架。这一模版详尽地描绘了诗人的职责、擅长的诗歌形式以及创作规则,使其能在自动化系统中更加精确地执…...
zookeeper选举kafka集群的controller
zookeeper选举kafka集群的controller目录 文章目录 zookeeper选举kafka集群的controller目录前言一、实操体验controller的选举二、模拟controller选举四、删除controller节点 前言 kafka集群的controller是kafka集群中一个有特殊作用的broker,负责整个kafka集群的…...
吉如一线段树:区间最值和历史最值
区间最值和历史最值 问题一 给定一个长度为 n n n 的数组 a a a , 实现以下三种操作 : 0 l r x : 将 a r r [ l ∼ r ] arr[l\sim r] arr[l∼r] 范围的每个数 v v v , 更新为 min ( v , x ) \min (v, x) min(v,x) 1 l r : 查询 max i l r a r r i \max_{il}^r ar…...
数据库常见的安全特性有哪些
数据库的安全特性主要包括以下几个方面,以确保数据的机密性、完整性和可用性: 1. 身份验证(Authentication) 数据库系统会通过身份验证来确定用户的身份,常见的方式有用户名/密码验证、基于证书的验证、多因素验证&a…...
Debezium日常分享系列之:Debezium 3.0.0.Final发布
Debezium日常分享系列之:Debezium 3.0.0.Final发布 Debezium 核心的变化需要 Java 17基于Kafka 3.8 构建废弃的增量信号字段的删除每个表的详细指标 MariaDB连接器的更改版本 11.4.3 支持 MongoDB连接器的更改MongoDB sink connector MySQL连接器的改变MySQL 9MySQL…...
MVCC(多版本并发控制)
目录 1.MVCC的工作原理2.MVCC的优点3.例子 MVCC(多版本并发控制)是一种用于数据库管理系统中实现并发控制的技术。它允许多个事务同时对数据库进行读写操作,而不会相互干扰,从而提高数据库系统的性能和可用性。MVCC通过为每个事务…...
低代码可视化-uniapp响应式数据data-代码生成器
在uniapp框架中,data 是一个核心的概念,它代表了组件或uniapp实例中的响应式数据。这些数据是组件状态的基础,uniapp会根据这些数据的变化来更新DOM,从而保持视图与数据的同步。 data 的特点 响应式:uniapp使用一种称…...
10.7学习
1.安全认证 ●Session 认证中最常用的一种方式,也是最简单的。存在多节点session丢失的情况,可通过nginx粘性Cookie和Redis集中式Session存储解决 ●HTTP Basic Authentication 服务端针对请求头中base64加密的Authorization 和用户名和密码进行校验。…...
基础算法之前缀和--Java实现(下)--LeetCode题解:-和为 K 的子数组 - 和可被 K 整除的子数组 -连续数组-矩阵区域和
这里是Themberfue 和为 K 的子数组 题目解析 返回子数组中所有元素的和等于给定k的个数。 算法讲解 这题好像是用滑动窗口解决,但其实不能,因为 nums 中的元素可能存在负数,就不能保证其单调性的性质。 用前缀和求也不易想到,…...
序列化与反序列化基础及反序列化漏洞(附案例)
参考文章: [web安全原理]PHP反序列化漏洞 - 笑花大王 - 博客园 (cnblogs.com) 一、概念 为了能有效的存储数据而不丢失数据的类型和内容,经常需要通过序列化对数据进行处理,将数据进行序列化后,会生成一个字符串,字符…...
Khronos:动态环境下时空度量语义SLAM的统一方法
Khronos: A Unified Approach for Spatio-Temporal Metric-Semantic SLAM in Dynamic Environments 原文 项目 引言: 人类居住环境通常是高度动态的,人、机器人和其他实体不断移动、互动和改变场景。对于机器人在这种情况下的操作,仅仅建立一…...
一个迷茫的25岁前端程序员的自述
作者:一尾流莺 一直听说程序员的危机在 35 岁,没想到我的危机从 25 岁就开始了。 我甚至不知道自己是不是 25 岁,也可能是 26 岁,或者 27 岁,1998 年的生日,按照 2023 - 1998 的算法就是 25,按…...
多文件并发多线程MD5工具(相对快速的MD5一批文件),适配自定义MD5 Hash I/O缓存。
自己写的多文件 MD5校验工具,一个文件开一个线程,有最大I/O 缓存设置,兼容读写MD5后缀文件。 共计91个文件,合计180G左右 12分钟左右,UI基本卡废,但程序没蹦,属于正常。 卡的原因是基本是用 I/O…...
Pikachu-url重定向-不安全的url跳转
不安全的url跳转 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能发生"跳错对象"的问题。 url跳转比较直接的危害是: …...
如何下载和安装CLion,图文详解
一、下载 登录JetBrains官网,下载最新版本的Clion,Clion目前没有社区版,都是专业版。 二、安装 1、启动Clion安装程序,下一步。 2、修改安装目录,下一步。 3、创建桌面快捷方式,更新PATH变量࿰…...
vue3导入本地图片2种实现方法
在<script setup>中使用import语法: <template><img :src"logo" alt"Logo"> </template><script setup> import logo from ./assets/logo.png; </script> 使用Vue的ref来动态地在<script setup>中…...
leetcode 刷题day36动态规划Part05 背包问题(完全背包、518. 零钱兑换 II、377. 组合总和 Ⅳ、70. 爬楼梯 (进阶))
完全背包 完全背包的每件商品都有无限个,和01背包的一不同主要体现在遍历顺序上。为了保证每个物品仅被添加一次,01背包内嵌的循环是从大到小遍历。而完全背包的物品是可以添加多次的,所以要从小到大去遍历。 518. 零钱兑换 II 思路&#…...
检查jar冲突,查找存在相同class的jar
写在前面 本文看下如何查找jar冲突,即查找哪些jar包中存在相同的class。如果是存在相同jar的不同版本,基本一眼就能看出来,然后结合maven的依赖关系将其剔除掉即可,但是当你遇到了有人手动拷贝某些class到jar包中导致冲突的情况时…...
PhpStudy-PHP5.4.45后门漏洞应用程序(C++/base64/winhttp)
PhpStudy-PHP5.4.45后门漏洞应用程序(C/base64/winhttp) 前言引言(时间回到多年前) PhpShellCmd.exe使用介绍:(1)输入网址检测是否存在PHP/5.4.45(2)whoami(3…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙
WebGL:在浏览器中解锁3D世界的魔法钥匙 引言:网页的边界正在消失 在数字化浪潮的推动下,网页早已不再是静态信息的展示窗口。如今,我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室,甚至沉浸式的V…...
职坐标物联网全栈开发全流程解析
物联网全栈开发涵盖从物理设备到上层应用的完整技术链路,其核心流程可归纳为四大模块:感知层数据采集、网络层协议交互、平台层资源管理及应用层功能实现。每个模块的技术选型与实现方式直接影响系统性能与扩展性,例如传感器选型需平衡精度与…...
