数据结构之归并排序

  所谓“归并”,是将两个或两个以上的有序文件合并成为一个新的有序文件。归并排序的一种实现方法是把一个有n个记录的无序文件看成是由n个长度为1的有序子文件组成的文件,然后进行两两归并,得到[ n 2 \frac n2 2n]个长度为2或1的有序文件,再两两归并,如此重复,直到最后形成包含 n 个记录的有序文件为止。这种反复将两个有序文件归并成一个有序文件的排序方法称为两路归并排序。
  两路归并排序的核心操作是将一维数组中前后相邻的两个有序序列归并为一个有序序列。
  【算法】将分别有序的 data[s…m]和 data[m+1…n]归并为有序的data[s…n]。

void Merge(int data[], int s, int m, int n)
{int i, start = s, k = 0;int *temp;temp =(int *)malloc((n-s+1)*sizeof(int));	/*辅助空间*/for(i= m+1; s <= m &&i<= n; ++k)			/*将 data[s..m]与data[m+l..n]归并后存入temp*/if (data[s] < data[i]) temp[k] = data[s++];else temp[k] = data[i++];for(; s <= m; ++k)							/*将剩余的data[s..m]复制到 temp*/temp[k] = data[s++];for(; i <= n; ++k)							/*将剩余的data[i..n]复制到 temp*/temp[k] = data[i++];for(i=0; i<k; i++)data[start++] = temp[i]:free(temp);
}/*Merge*/

  一趟归并排序的操作是:调用[n/2h]次 Merge 算法,将数组 data1[0…n-1]中前后相邻且长度为h的有序段进行两两归并,得到前后相邻、长度为 2h 的有序段,并存放在 data2[0…n-1]中,整个归并排序需进行[log2n]趟。归并排序需要辅助空间n个(与待排记录数量相等),时间复杂度为O(nlogn)。
  【算法】递归形式的两路归并。

void MSort(int data[], int s, int t)	/*对 data[s..t]进行归并排序*/
{int m;if(s<t){m = (s+t)/2;			/*将 data[s..t]均分为 data[s..m]和 data[m+1..t]*/MSort(data, s, m);		/*递归地对 data[s..m]进行归并排序*/MSort(data, m+1, t);	/*递归地对 data[m+1..t]进行归并排序*/Merge(data, s, m, t);	/*将 data[s..m]和 data[m+1..t]归并为data[s..t]*/}
}/*MSort*/

  【算法】对一维数组 data[0…n-1]中的元素进行两路归并排序。

void MergeSort(int data[], int n)
{MSort(data, 0, n-1);
}/*MergeSort*/

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

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

相关文章

UUID和雪花(Snowflake)算法该如何选择?

UUID和雪花(Snowflake)算法该如何选择&#xff1f; UUID 和 Snowflake 都可以生成唯一标识&#xff0c;在分布式系统中可以说是必备利器&#xff0c;那么我们该如何对不同的场景进行不同算法的选择呢&#xff0c;UUID 简单无序十分适合生成 requestID&#xff0c; Snowflake 里…

Flink实战六_直播礼物统计

接上文&#xff1a;Flink实战五_状态机制 1、需求背景 现在网络直播平台非常火爆&#xff0c;在斗鱼这样的网络直播间&#xff0c;经常可以看到这样的总榜排名&#xff0c;体现了主播的人气值。 人气值计算规则&#xff1a;用户发送1条弹幕互动&#xff0c;赠送1个荧光棒免费…

c++学习:基本变量类型+宽字符用法

数据类型 描述 大小&#xff08;通常情况 下&#xff09; 用途 int 整型 至少 16 位 存储整数 short int 短整型 至少 16 位 存储较…

λ-矩阵知识点

原文:链接 λ-矩阵 若矩阵 A \mathbf{A} A 的元素为关于 λ λ λ 的多项式&#xff0c;则称 A \mathbf{A} A 为 λ λ λ-矩阵 (表示为 A ( λ ) \mathbf{A}(λ) A(λ)). λ λ λ-矩阵也存在秩、逆、初等变换、相抵的概念, 但是有一些不同. 定义. λ λ λ-矩阵的秩是…

07-使用Package、Crates、Modules管理项目

上一篇&#xff1a;06-枚举和模式匹配 当你编写大型程序时&#xff0c;组织代码将变得越来越重要。通过对相关功能进行分组并将具有不同功能的代码分开&#xff0c;您可以明确在哪里可以找到实现特定功能的代码&#xff0c;以及在哪里可以改变功能的工作方式。 到目前为止&…

必收藏!第六版CCF推荐会议C类国际学术会议!(中国计算机学会)

中国计算机学会 中国计算机学会&#xff08;CCF&#xff09;是全国性、学术性、非营利的学术团体&#xff0c;由从事计算机及相关科学技术领域的个人和单位自愿组成。作为独立社团法人&#xff0c;CCF是中国科学技术协会的成员之一&#xff0c;是全国一级学会&#xff01; CCF的…

JavaScript基础第四天

JavaScript 基础第四天 今天我们学习js的函数&#xff0c;包括普通函数、匿名函数、箭头函数以及函数作用域。 1. 函数的初体验 1.1. 什么是函数 函数是 JavaScript 中的基本组件之一。一个函数是 JavaScript 过程一组执行任务或计算值的语句。要使用一个函数&#xff0c;你…

Linux下库函数、静态库与动态库

库函数 什么是库 库是二进制文件, 是源代码文件的另一种表现形式, 是加了密的源代码; 是一些功能相近或者是相似的函数的集合体. 使用库有什么好处 提高代码的可重用性, 而且还可以提高程序的健壮性;可以减少开发者的代码开发量, 缩短开发周期. 库制作完成后, 如何给用户…

大模型为什么会有 tokens 限制?

人是以字数来计算文本长度&#xff0c;大语言模型 &#xff08;LLM&#xff09;是以 token 数来计算长度的。LLM 使用 token 把一个句子分解成若干部分。 token 可以是一个单词、一个单词中的一个部分、甚至是一个字符&#xff0c;具体取决于它使用的标记化方法 (tokenization…

为电子表格嵌入数据库,Excel/WPS一键升级为管理系统

将Excel表格转化为管理系统&#xff0c;这款工具能够实现只需导入表格数据&#xff0c;即可自动生成相应的软件和APP。 表格办公的烦恼&#xff0c;有遇到吧&#xff1f; 对于具有一定规模的企业而言&#xff0c;各类表格如同繁星般众多&#xff0c;既有日常使用的常规表格&a…

泰克示波器——TBS2000系列界面整体介绍

目录 1.1 通道区域面板标识1.2 示波器测试输出&#xff08;检测探针与设置的好坏&#xff09;1.3 面板其他快捷按钮1.4 波器整体界面 1.1 通道区域面板标识 在通道面板的下方标识有示波器的通道属性以及参数值&#xff0c;如我使用的型号为“TBS2104X”的示波器&#xff0c;面…

格子表单GRID-FORM | 文档网站搭建(VitePress)与部署(Github Pages)

格子表单/GRID-FORM已在Github 开源&#xff0c;如能帮到您麻烦给个星&#x1f91d; GRID-FORM 系列文章 基于 VUE3 可视化低代码表单设计器嵌套表单与自定义脚本交互文档网站搭建&#xff08;VitePress&#xff09;与部署&#xff08;Github Pages&#xff09; 效果预览 格…

如何使用VMware分享出来的虚拟机系统(OVF文件)

前言 这几天看到很多小伙伴都在安装虚拟机&#xff0c;但成不成就不知道了。 所以小白准备把自己安装完成的系统打包分享给小伙伴。 如果你需要已经安装完成的虚拟系统&#xff0c;可以获取哦&#xff01;打开即用&#xff01; 虚拟机系统包括&#xff1a; Win10 专业版 Wi…

关于git经常会碰到的几个场景分析

1.把其他远程分支代码同步合并到本地分支&#xff0c;比如&#xff1a;git将另一个远程分支origin/develop代码合入我现在的本地分支B,本地分支对应的远程分支是origin/b。 要将远程分支 origin/develop 的代码合并到本地分支 B&#xff08;对应的远程分支是 origin/B&#xf…

anaconda+pytorch+pycharm安装总结

1.下载最新的Anaconda,目前是python3.11适用 anaconda官网 安装教程 卸载并重新安装的教程 &#xff08;如果找不到火绒清理注册表垃圾的位置可以拉到文章底部查看&#xff09; 2.pytorch安装&#xff0c;注意python版本、cuda版本和pytorch版本的适配 安装教程 3.pycharm安装和…

C++: 模板初阶

目录 引子&#xff1a; 函数模板 格式&#xff1a; 例子&#xff1a; 函数模板的实例化&#xff1a; 隐形实例化&#xff1a;让编译器根据实参推演模板参数的实际类型 显式实例化&#xff1a; 在函数名后的<>中指定模板参数的实际类型 模板参数的匹配原则 类模…

ssm+vue的校园一卡通密钥管理系统(有报告)。Javaee项目,ssm vue前后端分离项目。

演示视频&#xff1a; ssmvue的校园一卡通密钥管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;ssm vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系…

C++入门学习(二十五)do-while循环

do { // 代码块&#xff0c;至少会执行一次 } while (条件); 对比一下while和do-while循环&#xff1a; 因为while循环先判断条件&#xff0c;所以数字10直接就没有进入for循环里&#xff0c;卡在了判断条件这一步&#xff0c;所以就没有输出数据&#xff1b; do-while循环是…

clickhouse计算前后两点间经纬度距离

问题 计算如图所示前后两点经纬度的距离&#xff1f; 方法 1、用开窗函数将如图所示数据下移一行 selectlongitude lon1,latitude lat1,min(longitude) over(order by time1 asc rows between 1 PRECEDING and 1 PRECEDING) lon2,min(latitude) over(order by time1 asc row…

查询到List后再进行分页(mybatis-plus

如果您需要首先获取符合条件的所有数据&#xff0c;然后在内存中进行筛选&#xff0c;以满足特定条件&#xff0c;而不是在数据库层面进行条件查询&#xff0c;您可以继续使用您的原始实现。但是&#xff0c;为了正确实现分页&#xff0c;您需要对分页结果进行调整。以下是一个…