插入排序,希尔排序,和归并排序
每一本数据结构和算法的教科书中,都不厌其烦的介绍了排序算法。不厌其烦的介绍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…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
