排序——归并排序及排序章节总结

前面的文章中 我们详细介绍了排序的概念,插入排序,交换排序与选择排序,大家可以通过下面的链接再去学习:

​​​​​​排序的概念及插入排序

交换排序

选择排序

这篇文章就详细介绍一下另一种排序算法:归并排序以及对排序章节进行一下总结。

一,归并排序基本概念

归并:将两个或两个以上的有序表组合成一个新有序表

2-路归并排序

排序过程

初始序列看成n有序子序列,每个子序列长度为1

两两合并,得到 ë n/2 û 个长度为21的有序子序列

再两两合并,重复直至得到 一个 长度为 n 的有序序列为止

例:

将两个顺序表合成一个有序表

两个有序子序列的归并

设两个有序表存放在同一数组中相邻的位置上:R[low..mid]R[mid + 1..high]

每次分别从两个表中取出一个记录进行关键字的比较,将较小者放入T[1ow..high]

重复 此过程,直至其中一个表为空,最后将另一非空表中余下的部分直接复制到 T

在代码中实现:

void Merge(RedType R[],RedType &T[],int low,int mid,int high)
{   i=low;j=mid+1;k=low; while(i<=mid&&j<=high) 	//将R中记录由小到大地并入T中{  if(R[i].key<=R[j].key) T[k]=R[i++]; else T[k]=R[j++];    }					while(i<=mid) T[k++]=R[i++];	//将剩余的R[low..mid]复制到T中 while(j<=high) T[k++]=R[j++];//将剩余的R[j.high]复制到T中 
}

 归并排序的递归

2-路归并排序将R[low..high]中的记录归并排序后放入T[low..high]中。当序列长度等于1时,递归结束,否则:

① 将当前序列一分为二,求出分裂点mid = (low+high)/2

② 对子序列R[low..mid]递归,结果放入S[low..mid]中;

③ 对子序列R[mid + 1..high]递归,结果放入S[mid + 1..high]中;

④ 调用算法 Merge ,将 S[ low..mid ] S[mid + 1..high] 归并 T[ low..high ]

 具体的代码实现递归过程:

void MSort(RedType R[],RedType &T[],int low,int high)
{  if(low==high) T[low]=R[low]; else{ mid=(low+high)/2;    	//将当前序列一分为二,求出分裂点mid MSort(R,S,low,mid);  	//R[low..mid]递归,结果放入S[low..mid] MSort(R,S,mid+1,high);//R[mid+1..high]递归,结果放入S[mid+1..high]Merge(S,T,low,mid,high);//将S[low..mid]和S[mid+1..high]归并到T[low..high]}						
} 

下面是一段完整的归并排序实例:

#include <stdio.h>// 合并两个子数组的函数
void merge(int arr[], int l, int m, int r) {int i, j, k;int n1 = m - l + 1; // 左子数组的大小int n2 = r - m;     // 右子数组的大小int L[n1], R[n2]; // 创建临时数组// 复制数据到临时数组 L[] 和 R[]for (i = 0; i < n1; i++)L[i] = arr[l + i];for (j = 0; j < n2; j++)R[j] = arr[m + 1 + j];// 合并临时数组回 arr[l..r]i = 0; // 初始化第一个子数组的索引j = 0; // 初始化第二个子数组的索引k = l; // 初始化合并后的子数组的索引while (i < n1 && j < n2) {if (L[i] <= R[j]) {arr[k] = L[i];i++;} else {arr[k] = R[j];j++;}k++;}// 复制 L[] 的剩余元素(如果有的话)while (i < n1) {arr[k] = L[i];i++;k++;}// 复制 R[] 的剩余元素(如果有的话)while (j < n2) {arr[k] = R[j];j++;k++;}
}// 归并排序的主函数
void mergeSort(int arr[], int l, int r) {if (l < r) {int m = l + (r - l) / 2; // 计算中间点mergeSort(arr, l, m); // 递归排序左半部分mergeSort(arr, m + 1, r); // 递归排序右半部分merge(arr, l, m, r); // 合并左右两部分}
}int main() {int arr[] = {12, 11, 13, 5, 6, 7};int arr_size = sizeof(arr) / sizeof(arr[0]);printf("给定的数组是 :");for (int i = 0; i < arr_size; i++)printf("%d ", arr[i]);printf("\n");mergeSort(arr, 0, arr_size - 1); // 对整个数组进行归并排序printf("排序后的数组是: ");for (int i = 0; i < arr_size; i++)printf("%d ", arr[i]);return 0;
}

算法分析

时间效率:O(nlog2n)

 空间效率:O(n

稳 定 性:稳定


二,排序章节总结

 各种排序算法的性能:

 首先通过下面这个图表对比一下

(数据不是顺次后移时将导致方法不稳定)

 按平均时间排序方法分为四类

  O(n2)、O(nlogn)、O(n1+e )、O(n)

 •快速排序是基于比较的内部排序中平均性能最好的

 • 基数排序时间复杂度最低,但对关键字结构有要求

                知道各级关键字的主次关系 

                 知道各级关键字的取值范围

为避免顺序存储时大量移动记录的时间开销,可考虑用链表作为存储结构:直接插入排序、归并排序、基数排序 。

不宜采用链表作为存储结构的折半插入排序、希尔排序、快速排序、堆排序 。

 排序算法的选择规则:

当n较大时

(1)分布随机,稳定性不做要求,则采用快速排序

(2)内存允许,要求排序稳定时,则采用归并排序

(3)可能会出现正序或逆序,稳定性不做要求,则采用堆排序或归并排序

当n较小时

(1)基本有序,则采用直接插入排序 

(2)分布随机,则采用简单选择排序,若排序码不接近逆序,也可以采用直接插入排序。

 


到此排序就结束了, 如果文章对你有用的话请点个赞支持一下吧!

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

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

相关文章

Uniapp基础篇(持续更新)

1. Uni-app常用内置组件 view 视图容器 scroll-view 可滚动视图区域&#xff0c;用于区域滚动。需注意在webview渲染的页面中&#xff0c;区域滚动的性能不及页面滚动。 swiper 滑块视图容器。一般用于左右滑动或上下滑动&#xff0c;比如banner轮播图。 image uniapp官方iam…

ROS服务通信机制实操Python

ROS服务通信机制实操Python 步骤流程vscode配置服务端客户端编辑配置文件编译并执行优化实现参数的动态提交优化先启动客户端后启动服务端 ROS服务通信的理论查阅&#xff1a;ROS服务通信流程理论 ROS服务通信的自定义srv数据的准备可以查阅&#xff1a;ROS服务通信自定义srv …

科研绘图系列:R语言雷达图(radar plot)

介绍 雷达图,又称为蜘蛛网图或星形图,是一种以多轴方式显示数据的图表。它通常用于显示多个定量变量的值,这些变量被表示为从中心点向外延伸的轴。每个轴代表一个变量,而每个变量的值则通过从中心向外延伸的距离来表示。雷达图可以直观地展示多个变量之间的相对大小和关系…

【Java面向对象】对象和类(下)

文章目录 1.静态变量、常量和方法2.可见性修饰符2.1 声明包2.2 变量和方法的可见性修饰符2.3 类的可见性修饰符2.4 私有构造方法 3.数据域封装4.对象参数&#xff0c;对象数组5.不可变对象和类6.变量的作用域7.this引用7.1 使用 this 引用数据域7.2 使用 this 调用构造方法 1.静…

【学术会议征稿】第八届控制工程与先进算法国际论坛(IWCEAA 2024)

第八届控制工程与先进算法国际论坛 8th International Workshop on Control Engineering and Advanced Algorithms(IWCEAA 2024) 第八届控制工程与先进算法国际论坛&#xff08;IWCEAA 2024&#xff09;将于2024年11月1-3日在中国南京隆重举行。会议旨在为从事算法、控制工程与…

昇思25天学习打卡营第七天|应用实践/生成式/Diffusion扩散模型

心得 这个课程是一个劝退的课程。讲述了Diffusion扩散模型实现原理。提供了这个原理的一些公式推导。当然看这个推导是需要一定的数学基础的。这个课程这么写&#xff0c;是为了让那些数学不怎么好的&#xff0c;知难而退吗&#xff1f; 这个课程还是一个比较难以复制粘贴的课…

C#面:MVC中的TempData\ViewBag\ViewData区别?

TempData 保存在Session中&#xff0c;Controller每次执⾏请求的时候&#xff0c;会从Session中先获取 TempData&#xff0c; ⽽后清除Session&#xff0c;获取完TempData数据&#xff0c;虽然保存在内部字典对象中&#xff0c;但是其集合中的每个条⽬访问⼀次后就从字典表中删…

使用Scikit-Learn决策树:分类问题解决方案指南

如何用scikit-learn的决策树分类器解决分类问题 1. 引言 在本教程中&#xff0c;我们将探讨如何使用scikit-learn&#xff08;sklearn&#xff09;库中的决策树分类器解决分类问题。决策树是一种强大的机器学习算法&#xff0c;能够根据输入数据的特征属性学习决策规则&#…

[短笔记] Ubuntu配置环境变量的最佳实践

结论&#xff1a; 不确定是否要设为系统&#xff0c;则先针对当前用户设&#xff0c;写~/.profile确定为系统级&#xff0c;写/etc/environment&#xff0c;注意无需export不推荐写在~/.bashrc&#xff08;Ubuntu不推荐&#xff0c;理由见references&#xff09; References&…

陪玩系统小程序模式APP小程序H5系统搭建开发

随着移动互联网的营及和游戏行业的蓬轨发展&#xff0c;陪玩服务应远而生并迅速唱起&#xff0c;陪玩系统小程序作为连接游戏玩家与陪玩师的桥梁&#xff0c;其模式系统的搭建与开发是得尤为重要&#xff0c;本文将洋细凰述陪玩系统小程宗模式系统的搭建开发流程&#xff0c;包…

Nginx入门到精通四(反向代理2)

下面内容整理自bilibili-尚硅谷-Nginx青铜到王者视频教程 Nginx相关文章 Nginx入门到精通一&#xff08;基本概念介绍&#xff09;-CSDN博客 Nginx入门到精通二&#xff08;安装配置&#xff09;-CSDN博客 Nginx入门到精通三&#xff08;Nginx实例1&#xff1a;反向代理&a…

Spring Security 授权

基于request的授权 HttpSecurity 权限配置 Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests(authorize -> {authorize// 放行请求:针对含有 admin 权限的用户放行 /user/get 接口.requestMatchers("/us…

【Druid 未授权访问漏洞】解决办法

【Druid 未授权访问漏洞】解决办法 漏洞描述 Alibaba Druid 未授权访问【原理扫描】 Alibaba Druid是一款Java语言开发的数据库连接池。Druid能够提供强大的监控和扩展功能。 Alibaba Druid 默认情况下未设置访问控制&#xff0c;攻击者可以登录以获取敏感信息 修改web.xml…

深入理解 React 18 中的 memo 和 useCallback:优化你的组件性能

深入理解 React 18 中的 memo 和 useCallback&#xff1a;优化你的组件性能 在现代前端开发中&#xff0c;性能优化是一个永恒的话题。React 18 引入了一些新的特性和改进&#xff0c;使得性能优化变得更加容易和高效。今天&#xff0c;我们将深入探讨两个非常重要的 Hooks&am…

UE4-光照渲染、自动曝光、雾

目录 一.光源种类 二.灯光的移动性 三.自动曝光 四.指数级高度雾 五.实现光束 一.光源种类 1.定向光源 用来模拟现实中的太阳光。 2.点光源 比如现实中的灯泡 3.聚光源 4.矩形光源 是这几个光源中性能开销最大的&#xff0c;一般不用到游戏场景中&#xff0c;因为游…

【文心智能体】前几天百度热搜有一条非常有趣的话题《00后疯感工牌》,看看如何通过低代码工作流方式实现图片显示

00后疯感工牌体验&#xff1a;https://mbd.baidu.com/ma/s/6yA90qtM 目录 前言比赛推荐工作流创建工作流入口创建工作流界面工作流界面HTTP工具卡点地方 总结推荐文章 前言 前几天百度热搜有一条非常有有趣《00后疯感工牌》。 想着通过文心智能体去一键生成00后疯感工牌是不是…

Qt 多语言

记录Qt多语言的实现过程 目录 1.项目配置文件.pro配置 2.程序中的字符串用tr()封装 3.生成翻译文件 4.使用Qt语言家修改翻译文件 4.1使用Qt语言家打开 4.2 .更改文件配置 5. 生成qm文件 6.代码执行切换语言 6.1入口处 6.2 事件执行 0.效果 1.项目配置文件.pro配置 T…

js执行机制----事件循环

前言 问题 一般情况下,我们都认为js是顺序执行的 但是遇到下列情况 setTimeout(function(){console.log(定时器开始啦) });new Promise(function(resolve){console.log(马上执行for循环啦);for(var i 0; i < 10000; i){i 99 && resolve();} }).then(function(…

AI技术在企业招聘中的应用案例分析

一、引言 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;其在企业招聘领域的应用也越来越广泛。AI技术不仅改变了传统的招聘流程&#xff0c;还提高了招聘的效率和准确性&#xff0c;为企业招聘人员提供了更加便捷、高效的方式。本文将以某大型互联网公司…

opencv—常用函数学习_“干货“_2

目录 五、矩阵计算函数 归一化矩阵 (normalize) 转置矩阵 (transpose) 求矩阵的逆 (invert) 翻转矩阵 (flip) 旋转矩阵 (rotate) 求矩阵的行列式 (determinant) 求矩阵的迹 (trace) 求矩阵的特征值和特征向量 (eigen) 六、代数运算 矩阵加法 (add) 矩阵减法 (subtra…