C++数据结构X篇_24_归并排序(稳定的排序)

news2024/12/23 13:43:56

本篇参考十大经典排序算法-归并排序算法详解进行整理和补充。

文章目录

  • 1. 什么是归并排序
    • 1.1 概念
    • 1.2 算法原理
    • 1.3 算法实现
  • 2. 归并排序算法特点
    • 2.1 时间复杂度
    • 2.2 空间复杂度
    • 2.3 稳定性

1. 什么是归并排序

1.1 概念

归并排序(Merge sort) 是建立在归并操作上的一种有效的排序算法,归并排序对序列的元素进行逐层(递归)折半分组,然后从最小分组开始比较排序,合并成一个大的分组,逐层进行,最终所有的元素都是有序的。
归并排序基本思想:将两个有序序列合并成一个有序序列。

1.2 算法原理

这是一个无序数列:4、5、8、1、7、2、6、3,我们要将它按从小到大排序。按照归并排序的思想,我们要把序列逐层进行拆分
在这里插入图片描述
序列逐层拆分如下
在这里插入图片描述
然后从下往上逐层合并,首先对第一层序列1(只包含元素4)和序列2(只包含元素5)进行合并

创建一个大序列,序列长度为两个小序列长度之和,p1、p2指针分别指向两个小序列的第一个元素,p指向大序列的第一个元素
在这里插入图片描述
比较p1、p2指向的元素,4小于5,将4填入p指向的元素,p、p1往右移一位
在这里插入图片描述
此时,序列1已经没有元素,将序列2的元素依次填入大序列中
在这里插入图片描述
序列8和1,序列7和2,序列6和3,用同样的方式填入新的序列
在这里插入图片描述
接着,以4、5为序列1,1、8为序列2,继续进行合并

创建一个序列长度为4的大序列,p1指向序列1的第一个元素4,p2指向序列2的第一个元素1,p指向大序列的第一个元素
在这里插入图片描述
4和1比较,4大于1,1填入p指向的元素,p、p2往右移一位

在这里插入图片描述
4和8比较,4小于8,4填入p指向的元素,p、p1往右移一位
在这里插入图片描述
5和8比较,5小于8,5填入p指向的元素,p、p1往右移一位
在这里插入图片描述
自此,序列1已经没有元素,将序列2的元素依次填入大序列中
在这里插入图片描述
序列2、7和序列3、6以同样的方式合并成新的序列
在这里插入图片描述
最后,将序列1、4、5、8和序列2、3、6、7以同样的方式继续合并成新的序列
在这里插入图片描述
至此所有的元素都是有序的

1.3 算法实现

#include <iostream>
#include <time.h>
#include <sys/timeb.h>

using namespace std;

#define MAX 10

//获取系统当前时间,ms为单位
long getSystemTime()
{
	struct timeb tb;
	ftime(&tb);
	return tb.time * 1000 + tb.millitm;
}


//打印数组
void printArr(int arr[])
{
	for (int i = 0; i < 10; i++)
	{
		cout << arr[i] << " ";
	}
	cout << endl;
}

//初始化数组
int* CreateArray()
{
	//数据放到堆区
	int* arr = (int*)malloc(sizeof(int)*MAX);
	//生成随机数
	srand((unsigned int)time(NULL));
	for (int i = 0; i < MAX; i++)
	{
		arr[i] = rand() % MAX;
	}

	return arr;
}

//合并算法,从小到大
void Merge(int arr[], int start, int end, int mid, int* tmp)
{
	int i_start = start;
	int i_end = mid;

	int j_start = mid + 1;
	int j_end = end;

	//表示辅助空间有多少元素
	int length = 0;

	//合并两个有序序列
	while (i_start <= i_end && j_start <= j_end)
	{
		if (arr[i_start] < arr[j_start])
		{
			tmp[length] = arr[i_start];
			length++;
			i_start++;
		}
		else
		{
			tmp[length] = arr[j_start];
			length++;
			j_start++;
		}
	}

	//有一个序列会有剩下的元素,无法知道是哪个,进行遍历将剩余元素拷贝到辅助空间
	//i这个序列
	while (i_start <= i_end)
	{
		tmp[length] = arr[i_start];
		i_start++;
		length++;
	}

	//j这个序列
	while (j_start <= j_end)
	{
		tmp[length] = arr[j_start];
		j_start++;
		length++;
	}

	//辅助空间数据覆盖原空间
	for (int i = 0; i < length; i++)
	{
		arr[start + i] = tmp[i];
	}
}

//归并排序,tmp是辅助空间,排序完的结果放到其中
void MergeSort(int arr[], int start, int end, int* tmp)
{
	//递归结束条件
	if (start >= end)
	{
		return;
	}

	int mid = (start + end) / 2;
	//递归 分组
	//左半边
	MergeSort(arr, start, mid, tmp);
	//右半边
	MergeSort(arr, mid + 1, end, tmp);

	//合并
	Merge(arr, start, end, mid, tmp);
}



int main()
{
	int* myArr = CreateArray();

	//辅助空间
	int* tmp = (int*)malloc(sizeof(int)*MAX);

	printArr(myArr);
	MergeSort(myArr, 0, MAX - 1, tmp);
	printArr(myArr);

	//释放空间
	free(tmp);
	free(myArr);

	return 0;
}

2. 归并排序算法特点

2.1 时间复杂度

归并排序算法每次将序列折半分组,共需要logn轮,因此归并排序算法的时间复杂度是O(nlogn)

2.2 空间复杂度

归并排序算法排序过程中需要额外的一个序列去存储排序后的结果,所占空间是n,因此空间复杂度为O(n)

2.3 稳定性

归并排序算法在排序过程中,相同元素的前后顺序并没有改变,所以归并排序是一种稳定排序算法

  1. 视频:归并排序1

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

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

相关文章

NFTScan 获 Optimism 基金会 Cycle 14 Grant 支持 35,000 枚 OP !

近期&#xff0c;Optimism 基金会官方公布了 Grants Program Cycle 14 的最终入选项目名单&#xff0c;NFTScan 团队获得了 35k OP 的 Grant 资金支持。 Cycle 14 Final: https://app.charmverse.io/op-grants/page-47078316203750115 作为 Optimism 生态的 NFT 基础设施&…

内网渗透——macOS上搭建Web服务器

# 公网访问macOS本地web服务器【内网穿透】 文章目录 1. 启动Apache服务器2. 公网访问本地web服务2.1 本地安装配置cpolar2.2 创建隧道2.3 测试访问公网地址3. 配置固定二级子域名3.1 保留一个二级子域名3.2 配置二级子域名4. 测试访问公网固定二级子域名 以macOS自带的Apache…

惊艳,这个html5播放器支持视频切换、倍速切换、视频预览

很赞哇&#xff01;&#xff01; 本文将对视频播放相关的功能进行说明&#xff08;基于云平台&#xff09;&#xff0c;包括初始化播放器、播放器尺寸设置、视频切换、倍速切换、视频预览、自定义视频播放的开始/结束时间、禁止拖拽进度、播放器皮肤、控件按钮以及播放控制等。…

使用群晖Synology Office提升生产力:多人同时编辑一个文件

使用群晖Synology Office提升生产力&#xff1a;多人同时编辑一个文件 文章目录 使用群晖Synology Office提升生产力&#xff1a;多人同时编辑一个文件本教程解决的问题是&#xff1a;1. 本地环境配置2. 制作本地分享链接3. 制作公网访问链接4. 公网ip地址访问您的分享相册5. 制…

Inbound marketing的完美闭环:将官网作为营销枢纽,从集客进化为入站

Inbound marketing即入站营销的运作方式不同于付费广告&#xff0c;你需要不断地投入才能获得持续的访问量。而你的生意表达内容一经创建、发布&#xff0c;就能远远不断地带来流量。 Inbound marketing也被翻译作集客营销&#xff0c;也就是美国知名的营销SaaS企业hubspot所主…

react-组件间的通讯

一、父传子 父组件在使用子组件时&#xff0c;提供要传递的数据子组件通过props接收数据 class Parent extends React.Component {render() {return (<div><div>我是父组件</div><Child name"张" age{16} /></div>)} }const Child …

OJ练习第183题——天际线问题

天际线问题 力扣链接&#xff1a;218. 天际线问题 题目描述 城市的 天际线 是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度&#xff0c;请返回 由这些建筑物形成的 天际线 。 示例 官解思路&#xff08;扫描线优先队列&#xff09; 观…

【httpd】 Apache http服务器目录显示不全解决

文章目录 1. 文件名过长问题1.1 在centos中文件所谓位置etc/httpd/conf.d/httpd-autoindex.conf1.2 在配置文件httpd-autoindex.conf中的修改&#xff1a;1.3 修改完成后重启Apache&#xff1a; 1. 文件名过长问题 1.1 在centos中文件所谓位置etc/httpd/conf.d/httpd-autoindex…

android开发使用OkHttp自带的WebSocket实现IM功能

一、背景 android app开发经常会有IM需求&#xff0c;很多新手不晓得如何入手&#xff0c;难点在于通讯不中断。其实android发展到今天&#xff0c;很多技术都很完善&#xff0c;有很多类似框架可以实现。例如有&#xff1a;okhttp自带的websocket框架、easysocket等等。本文主…

69 划分字母区间

划分字母区间 题解1 贪心1&#xff08;方法略笨&#xff0c;性能很差&#xff09;题解2 贪心2&#xff08;参考标答&#xff09; 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段&#xff0c;同一字母最多出现在一个片段中。 注意&#xff0c;划分结果需要满足&am…

Visual C++编程初学者疑难问题大集合(二)

初学者在学习visual c时问题很多&#xff0c;有意思的是&#xff0c;很多问题教材上都不说&#xff0c;后台有不少小伙伴问我相关问题&#xff0c;我于是总结一下。以供学习visual c的小伙伴少走弯路。 问题六&#xff1a;怎么理解visual c中函数的声明和定义 在复杂的程序中&…

SSM宾馆客房管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 宾馆客房管理系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统…

全网火爆,Python接口自动化测试 logging日志模块,看这篇就够了...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、logging模块介…

c4d和blender哪个简单?哪个好用?

新手初学3D制作&#xff0c;选C4D还是Blender&#xff1f;c4d和blender哪个简单&#xff1f;c4d和blender哪个好用&#xff1f;c4d和blender的区别&#xff1f;今天一篇文章带你搞定这2个软件的区别。 刚涉及到动画和3D建模领域的小白们&#xff0c;在面对近几年业内爆火的C4D…

更加轻松处理相同文件名!覆盖复制操作全新升级,避免重复命名!

亲爱的用户&#xff0c;您是否在进行覆盖复制操作时&#xff0c;常常因为相同的文件名而无法正常完成任务&#xff1f;现在&#xff0c;我们为您推出了全新的覆盖复制升级版&#xff0c;让您更加轻松处理相同文件名&#xff0c;避免重复命名的尴尬局面&#xff01; 首先第一步…

【Python3】【力扣题】190. 颠倒二进制位

【力扣题】题目描述&#xff1a; 【Python3】代码&#xff1a; 1、解题思路&#xff1a;将整数转为二进制字符串&#xff0c;截取、反转、补足32位&#xff0c;再转回整数。 知识点&#xff1a;bin(...)&#xff1a;转为二进制字符串&#xff0c;即‘0bxx...’。 str [2:]&am…

awk学习笔记1-常用awk操作

(一)awk简介 linux 三剑客之awk,AWK 是一种处理文本文件的语言&#xff0c;是一个强大的文本分析工具。grep,sed和awk都是读一行处理一行&#xff0c;直到处理完成。 grep &#xff1a; 过滤文本 sed : 修改文本 awk : 处理文本(主要用来格式化,将文本按照指定的格式输出) …

大模型 | NEFTune之引入随机噪声对大模型训练的收益

大模型 | NEFTune之引入随机噪声对大模型训练的收益 paper中提到&#xff0c;在模型foward过程中&#xff0c;对inputs_embedding增加适度的随机噪声&#xff0c;会带来显著的收益。 Paper: https://arxiv.org/pdf/2310.05914.pdf Github: https://github.com/neelsjain/NEFT…

苹果官宣新品发布会 10月31日发布会与Mac有关

10 月 25 日消息&#xff0c;苹果宣布将于北京时间 10 月 31 日上午 8 点举行主题为“来势迅猛”的线上特别活动&#xff0c;届时或将有新品发布。 这场发布会与以往不同&#xff0c;将在北京时间 10 月 31 日上午 8 点举行。有很多猜测认为苹果届时会发布新款 Mac 电脑&#x…

dropbear-ssh2

编译&#xff1a; ./configure --prefix/home/lxin/workdir/install-dropbear --with-zlib/home/lxin/workdir/zlib/install-zlib-1.2.11/ CCx86_64-linux-gnu-gcc make clean make make install 生产秘钥 in bin dir: ./dropbearkey -t rsa -f ../sbin/dropbear_rsa_host…