排序算法-----归并排序

news2024/9/22 3:49:00

目录

前言:

归并排序

1. 定义

2.算法过程讲解

2.1大致思路

2.2图解示例

拆分合成步骤

 ​编辑

相关动态图 

 3.代码实现(C语言)

4.算法分析

4.1时间复杂度

4.2空间复杂度

 4.3稳定性


前言:

        今天我们就开始学习新的排序算法----归并排序,说到归并排序,最重要的思想就是分而治之,先分后治。相较于前面所学过的排序算法,归并排序过程相对比较复杂,但是不要慌!我会详细讲解这个过程的!下面我们就一起来学习吧!

归并排序

1. 定义

        归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并

2.算法过程讲解

2.1大致思路

已知一个数组arr[0,n-1],实现对这个数组进行拆分为arr[0,n/2]和arr[n/2+1,n-1]然后对这个数组进行进一步对半拆分,直到拆成每个分数组里面只有一个元素时,结束拆分;然后进入排序,按照拆分过程的路径进行排序合并,直到合并为一个数组的时候结束,最终得到的数组就是排序完成的数组。

归并排序是用分治思想,分治模式在每一层递归上有三个步骤:

  • 分解(Divide):将n个元素分成个含n/2个元素的子序列。
  • 解决(Conquer):用合并排序法对两个子序列递归的排序。
  • 合并(Combine):合并两个已排序的子序列已得到排序结果

2.2图解示例

拆分合成步骤

已知一个数组  [6,5,3,1,8,7,2,4],要求通过归并排序进行排序

第一步,依次拆分,直到每一个分数组剩下一个元素 ,如下所示:

                                                 6 5 3 1 8 7 2 4

第一次拆分                  6 5 3 1                           8 7 2 4

第二次拆分            6 5            3 1                8 7             2 4

第三次拆分        6        5       3        1        8        7       2        4

第二步,拆分完成之后,就进行排序        合并,如下所示:

                            6        5       3        1        8        7       2        4

第一次合并:          5 6               1 3              7 8              2 4      

第二次合并:                 1 3 5 6                            2 4 7 8

第三次合并:                              1 2 3 4 5 6 7 8

 以上步骤就完成了归并排序的过程了,演示图如下所示:

 

 

 动态图:

 

相关动态图 

 3.代码实现(C语言)

#include<stdio.h>
//归并排序
//合成排序
void merge(int* n,int *temp,int left,int mid,int rigth) {
	int l_pos = left;
	int r_pos = mid+1;
	int pos = left;
	while (l_pos <= mid && r_pos <= rigth) {
		if (n[l_pos] < n[r_pos])
			temp[pos++] = n[l_pos++];
		else
			temp[pos++] = n[r_pos++];
	}
	while (l_pos <= mid)
		temp[pos++] = n[l_pos++];
	while (r_pos <= rigth)
		temp[pos++] = n[r_pos++];
	while (left <= rigth) {
		n[left] = temp[left];
		left++;
	}

}
//拆分与归并
void msort(int *n,int *temp,int left,int right) {
	if (left < right) {
		int mid = (left + right) / 2;
		msort(n, temp, left, mid); //左边
		msort(n, temp, mid+1, right);//右半
		merge(n, temp, left, mid, right);
	}
}
//排序函数接口(整体)
void merge_sort(int* n, int length) {
	int* temp = (int*)malloc(sizeof(int) * length);
	if (temp) {
		msort(n, temp, 0, length-1);
		free(temp);
	}
	else {
		printf("Space allocation failure");
	}
}

int main() {
	int array[8] = { 25,24,6,65,11,43,22,51 };
	printf("排序前:");
	for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
		printf("%d ", array[i]);
	}
	printf("\n排序后:");
	merge_sort(array, sizeof(array) / sizeof(int));
	for (int i = 0; i < sizeof(array) / sizeof(int); i++) {
		printf("%d ", array[i]);
	}
}
//排序前:25 24 6 65 11 43 22 51
//排序后:6 11 22 24 25 43 51 65

4.算法分析

4.1时间复杂度

        归并排序的速度仅次于快速排序,速度是相当快的。因为归并排序每次都是在相邻的数据中进行操作,所以归并排序时间复杂度为O(nlogn)

4.2空间复杂度

 你知道么,归并排序在任何情况下的时间复杂度永远都是 O(nlogn),是不是很奇怪呢?别急,凡事有得必有失,归并排序是通过牺牲空间的代价来实现减小时间复杂度的。上面的代码涉及到数据暂存空间的开辟,其开辟的空间数量最大也不会超过n,所以空间复杂度为O(n)

 4.3稳定性

归并排序是稳定的排序算法,因为无论是在排序拆解过程中还是在归并过程中都没有改变相同元素的相对位置,所以是稳定的。

 好了,以上就是今天的全部内容了,你们学会了吗?我们下一期再见!

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

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

相关文章

数值类型表示二——定点和浮点格式

目录 目录 定点小数与定点整数 定点小数原反补的转换 定点小数与定点整数的取值范围 位数扩展的区别 浮点数的格式 浮点数的规格化 规格化处理举例 例1&#xff1a; 例2&#xff1a; 特例&#xff1a; 知识点总结&#xff1a; 浮点数的IEEE754标准 移码的回顾&…

通过UltraSync减轻主节点负担、提升业务系统性能,AntDB如何做到?

众所周知&#xff0c;数据库在多中心场景下&#xff0c;主中心主库不仅要承担原本业务的压力&#xff0c;而且还要将redo日志传输到不同的备库端&#xff0c;这样对主库将产生很大的性能影响。通常情况下&#xff0c;备中心和主中心不在同⼀机房&#xff0c;为了保证业务响应速…

Linux内核 6.6版本将遏制NVIDIA驱动的不正当行为

导读Linux 内核开发团队日前宣布&#xff0c;即将发布的 Linux 6.6 版本将增强内核模块机制&#xff0c;以更好地防御 NVIDIA 闭源驱动的不正当行为。 Linux 内核开发团队日前宣布&#xff0c;即将发布的 Linux 6.6 版本将增强内核模块机制&#xff0c;以更好地防御 NVIDIA 闭…

【HR】胜任力相关资料--20230915

0_建模技术介绍 传统的两种胜任力词典 光辉合益LOMINGER 67项能力检核表 海氏 DDI胜任力词典2.0 北森GENE建模技术 三种建模的方法 A公司 建模及应用 素质模型的组合 建模的选择 工具&#xff1a;光辉领导力素质卡片【38条素质】 素质模型示例 素质模型的应用及意义 1_能力素…

创建UI账号密码登录界面

头文件 #ifndef MYWND_H #define MYWND_H#include <QPushButton> #include <QMainWindow>class MyWnd : public QMainWindow {Q_OBJECTpublic:MyWnd(QWidget *parent nullptr);~MyWnd(); }; #endif // MYWND_H 源文件 #include "mywnd.h" #include &…

链动2+1模式:让中小企业家轻松实现社交电商

社交电商是一种利用社交网络和社群平台&#xff0c;通过人与人之间的互动和分享&#xff0c;实现商品或服务的销售和推广的电商模式。社交电商具有低成本、高效率、高转化率、高忠诚度等优势&#xff0c;是当下最火热的电商趋势之一。 然而&#xff0c;对于中小企业家来说&…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 七)

PersistentStorage&#xff1a;持久化存储UI状态 前两个小节介绍的LocalStorage和AppStorage都是运行时的内存&#xff0c;但是在应用退出再次启动后&#xff0c;依然能保存选定的结果&#xff0c;是应用开发中十分常见的现象&#xff0c;这就需要用到PersistentStorage。 Pe…

MongoDB的搭建 和crud操作

MongoDB docker 下载 docker run --restartalways -d --name mongo -v /docker/mongodb/data:/data/db -p 27017:27017 mongo:4.0.6使用navcat工具使用MongoDB Crud操作 jar包 <dependency><groupId>org.projectlombok</groupId><artifactId>lom…

three.js 入门 初识

基本步骤&#xff1a; 初始设置创建场景创建相机创建可见对象创建渲染器渲染场景 安装 npm install three 引入 import * as THREE from "three"; 一、three三要素&#xff1a;场景、相机、渲染 1.场景&#xff1a; //创建场景 const scenenew THREE.Scene()…

python中not的用法

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 话不多说&#xff0c;直接开搞&#xff0c;如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 python中的not具体表示是什么: 在python中not是逻辑判断词&#xff0c;用于布尔型True和False&#xff0c; not True为F…

【Unity插件】实现多人在线游戏——Mirror插件的使用介绍

文章目录 前言导入Mirror插件 简单介绍一、RPC调用二、错误注意 基本使用一、创建场景的网络管理器二、创建一个玩家三、添加玩家初始生成位置四、玩家控制五、同步摄像机六、同步不同角色的名字和颜色修改七、同步动画八、同步子弹方法一方法二 九、聊天功能十、场景同步切换十…

torch.where()两种用法

参考官方文档。 官方文档中只给了第一种用法。根据条件condition&#xff0c;从input,other中选择元素f返回。如果满足条件&#xff0c;则返回input元素。若不满足&#xff0c;返回other元素。 还有一种用法是通过where返回张量中满足条件condition的坐标&#xff0c;以二维张…

【Unity每日一记】资源加载相关和检测相关

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

中兴协力NB-IoT部署实验(含复杂项目)

这个实验要求每个人都完成一遍&#xff0c;并且不同学生的部分操作内容也不同&#xff0c;个别班级最后也被要求基于此完成复杂项目&#xff0c;黑字部分是必要操作&#xff0c;紫字部分是辅助完成操作或复杂项目的讲解 进入实验室&#xff0c;选择模拟器&#xff08;同一台模…

pytorch的自动微分、计算图 | 代码解析

在深度学习和机器学习中&#xff0c;自动微分是一个关键的概念&#xff0c;用于计算函数相对于其输入变量的导数&#xff08;梯度&#xff09;从而利用各类优化算法如梯度下降降低损失函数。PyTorch中的张量&#xff08;tensor&#xff09;提供了自动微分功能&#xff0c;它使得…

游戏视频录制软件对比,哪款最适合你的需求?

随着电子竞技和游戏直播行业的迅速崛起&#xff0c;越来越多的玩家渴望记录并分享自己在游戏中的精彩瞬间。游戏视频录制软件正是满足这一需求的关键工具。本文将针对三款优秀的游戏视频录制软件进行对比分析&#xff0c;以便为读者提供选购建议。 游戏视频录制软件1&#xff1…

Y4455芯片开发的433遥控流水灯方案

越来越多的家庭通过无线遥控来控制家中的照明系统&#xff0c;本文将介绍一种基于Y4455芯片的433MHz无线遥控流水灯方案&#xff0c;创造出美丽的照明场景。 一、宇凡微Y4455芯片简介 宇凡微Y4455芯片是一款低功耗、高性能的315MHz和433MHz短距离无线通讯发射芯片。它支持ASK…

Linux exec函数族

exec并不是生成新的进程还是在原进程执行 我们通常先创建一个子进程&#xff0c;在子进程里面使用exec&#xff0c;因为调用exec成功后&#xff0c;原进程的资源都被取代&#xff0c;除了一些进程ID等&#xff0c;所以在子进程里面调用exec&#xff0c;对原进程无影响。 前六个…

forest--声明式HTTP客户端框架-spring-b oot项目整合

Forest 是一个开源的 Java HTTP 客户端框架&#xff0c;它能够将 HTTP 的所有请求信息&#xff08;包括 URL、Header 以及 Body 等信息&#xff09;绑定到您自定义的 Interface 方法上&#xff0c;能够通过调用本地接口方法的方式发送 HTTP 请求。 官方链接&#xff1a; &…

实战演练 | Navicat 常用功能之转储与运行 SQL 文件

数据库管理工作中&#xff0c;"转储 SQL 文件"和"运行 SQL 文件"是两个极为常见操作。一般来说&#xff0c;用户使用数据库管理工具或命令行工具来完成。Navicat 管理开发工具中的“转储 SQL 文件”和“运行 SQL 文件”功能具有直观易用的界面、多种文件格…