当前位置: 首页 > news >正文

插入排序,希尔排序,和归并排序

每一本数据结构和算法的教科书中,都不厌其烦的介绍了排序算法。不厌其烦的介绍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

相关文章:

插入排序,希尔排序,和归并排序

每一本数据结构和算法的教科书中&#xff0c;都不厌其烦的介绍了排序算法。不厌其烦的介绍10余种不同的排序。那么实际编程中用得到那么多排序算法吗&#xff1f;当然用不到。那么为什么全世界的教科书都这么写呢&#xff1f;显然是醉翁之意不在酒。 数组&#xff0c;是每个编…...

Prompt 模版解析:诗人角色的创意引导与实践

Prompt 模版解析&#xff1a;诗人角色的创意引导与实践 Prompt 模版作为一种结构化工具&#xff0c;旨在为特定角色——本例中的“诗人”——提供明确的指导和框架。这一模版详尽地描绘了诗人的职责、擅长的诗歌形式以及创作规则&#xff0c;使其能在自动化系统中更加精确地执…...

zookeeper选举kafka集群的controller

zookeeper选举kafka集群的controller目录 文章目录 zookeeper选举kafka集群的controller目录前言一、实操体验controller的选举二、模拟controller选举四、删除controller节点 前言 kafka集群的controller是kafka集群中一个有特殊作用的broker&#xff0c;负责整个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…...

数据库常见的安全特性有哪些

数据库的安全特性主要包括以下几个方面&#xff0c;以确保数据的机密性、完整性和可用性&#xff1a; 1. 身份验证&#xff08;Authentication&#xff09; 数据库系统会通过身份验证来确定用户的身份&#xff0c;常见的方式有用户名/密码验证、基于证书的验证、多因素验证&a…...

Debezium日常分享系列之:Debezium 3.0.0.Final发布

Debezium日常分享系列之&#xff1a;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&#xff08;多版本并发控制&#xff09;是一种用于数据库管理系统中实现并发控制的技术。它允许多个事务同时对数据库进行读写操作&#xff0c;而不会相互干扰&#xff0c;从而提高数据库系统的性能和可用性。MVCC通过为每个事务…...

低代码可视化-uniapp响应式数据data-代码生成器

在uniapp框架中&#xff0c;data 是一个核心的概念&#xff0c;它代表了组件或uniapp实例中的响应式数据。这些数据是组件状态的基础&#xff0c;uniapp会根据这些数据的变化来更新DOM&#xff0c;从而保持视图与数据的同步。 data 的特点 响应式&#xff1a;uniapp使用一种称…...

10.7学习

1.安全认证 ●Session 认证中最常用的一种方式&#xff0c;也是最简单的。存在多节点session丢失的情况&#xff0c;可通过nginx粘性Cookie和Redis集中式Session存储解决 ●HTTP Basic Authentication 服务端针对请求头中base64加密的Authorization 和用户名和密码进行校验。…...

基础算法之前缀和--Java实现(下)--LeetCode题解:-和为 K 的子数组 - 和可被 K 整除的子数组 -连续数组-矩阵区域和

这里是Themberfue 和为 K 的子数组 题目解析 返回子数组中所有元素的和等于给定k的个数。 算法讲解 这题好像是用滑动窗口解决&#xff0c;但其实不能&#xff0c;因为 nums 中的元素可能存在负数&#xff0c;就不能保证其单调性的性质。 用前缀和求也不易想到&#xff0c;…...

序列化与反序列化基础及反序列化漏洞(附案例)

参考文章&#xff1a; [web安全原理]PHP反序列化漏洞 - 笑花大王 - 博客园 (cnblogs.com) 一、概念 为了能有效的存储数据而不丢失数据的类型和内容&#xff0c;经常需要通过序列化对数据进行处理&#xff0c;将数据进行序列化后&#xff0c;会生成一个字符串&#xff0c;字符…...

Khronos:动态环境下时空度量语义SLAM的统一方法

Khronos: A Unified Approach for Spatio-Temporal Metric-Semantic SLAM in Dynamic Environments 原文 项目 引言&#xff1a; 人类居住环境通常是高度动态的&#xff0c;人、机器人和其他实体不断移动、互动和改变场景。对于机器人在这种情况下的操作&#xff0c;仅仅建立一…...

一个迷茫的25岁前端程序员的自述

作者&#xff1a;一尾流莺 一直听说程序员的危机在 35 岁&#xff0c;没想到我的危机从 25 岁就开始了。 我甚至不知道自己是不是 25 岁&#xff0c;也可能是 26 岁&#xff0c;或者 27 岁&#xff0c;1998 年的生日&#xff0c;按照 2023 - 1998 的算法就是 25&#xff0c;按…...

多文件并发多线程MD5工具(相对快速的MD5一批文件),适配自定义MD5 Hash I/O缓存。

自己写的多文件 MD5校验工具&#xff0c;一个文件开一个线程&#xff0c;有最大I/O 缓存设置&#xff0c;兼容读写MD5后缀文件。 共计91个文件&#xff0c;合计180G左右 12分钟左右&#xff0c;UI基本卡废&#xff0c;但程序没蹦&#xff0c;属于正常。 卡的原因是基本是用 I/O…...

Pikachu-url重定向-不安全的url跳转

不安全的url跳转 不安全的url跳转问题可能发生在一切执行了url地址跳转的地方。如果后端采用了前端传进来的(可能是用户传参,或者之前预埋在前端页面的url地址)参数作为了跳转的目的地,而又没有做判断的话就可能发生"跳错对象"的问题。 url跳转比较直接的危害是: …...

如何下载和安装CLion,图文详解

一、下载 登录JetBrains官网&#xff0c;下载最新版本的Clion&#xff0c;Clion目前没有社区版&#xff0c;都是专业版。 二、安装 1、启动Clion安装程序&#xff0c;下一步。 2、修改安装目录&#xff0c;下一步。 3、创建桌面快捷方式&#xff0c;更新PATH变量&#xff0…...

vue3导入本地图片2种实现方法

在<script setup>中使用import语法&#xff1a; <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. 爬楼梯 (进阶))

完全背包 完全背包的每件商品都有无限个&#xff0c;和01背包的一不同主要体现在遍历顺序上。为了保证每个物品仅被添加一次&#xff0c;01背包内嵌的循环是从大到小遍历。而完全背包的物品是可以添加多次的&#xff0c;所以要从小到大去遍历。 518. 零钱兑换 II 思路&#…...

检查jar冲突,查找存在相同class的jar

写在前面 本文看下如何查找jar冲突&#xff0c;即查找哪些jar包中存在相同的class。如果是存在相同jar的不同版本&#xff0c;基本一眼就能看出来&#xff0c;然后结合maven的依赖关系将其剔除掉即可&#xff0c;但是当你遇到了有人手动拷贝某些class到jar包中导致冲突的情况时…...

PhpStudy-PHP5.4.45后门漏洞应用程序(C++/base64/winhttp)

PhpStudy-PHP5.4.45后门漏洞应用程序&#xff08;C/base64/winhttp&#xff09; 前言引言&#xff08;时间回到多年前&#xff09; PhpShellCmd.exe使用介绍&#xff1a;&#xff08;1&#xff09;输入网址检测是否存在PHP/5.4.45&#xff08;2&#xff09;whoami&#xff08;3…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...