C语言数据结构(11)——归并排序

news2024/10/5 19:09:09

欢迎来到博主的专栏C语言数据结构
博主ID:代码小豪

文章目录

    • 归并排序
      • 两个有序数组的合并
      • 归并排序
    • 归并排序的代码

归并排序

两个有序数组的合并

当前有两个有序数组arr1和arr2,我们创建一个可以容纳arr1和arr2同等元素个数的新数组arr。
在这里插入图片描述

让一个指针指向arr1的队首,一个指针指向arr2的队首,还有一个指针指向arr的队首。依次对比两个数组之间的值的大小,将数据较小的值放入arr中,再将对应的指针指向下一个元素。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时arr2已经遍历完了,将arr1的剩余数据全部拷贝到arr中。
在这里插入图片描述
在这里插入图片描述
可以发现,这种方法将有序数组合并之后任然是一个有序的数组,这是否说明,我们可以利用数组合并的方式实现一种排序算法呢?

在这里插入图片描述
这是一个无序数组arr,但是将这个数组分为两半。
在这里插入图片描述
就可以将两部分合并成一个有序的数组。

但是绝大多数的无序数组都无法找到这个分界线,所以想要利用合并有序数组完成排序,就需要先将整体的数组分为两部分,其中一部分是有序数组,另外一部分也是有序数组,然后再将这两个有序数组合并,完成排序。

当数组中的元素个数越来越多,那么出现两个有序数组的概率就会越来越小,这是显而易见的现象,那么如果反过来想呢?若是数组中的数据只有两个,那么出现两个有序数组的概率是百分之百。
在这里插入图片描述
如果现在有四个元素组成的数组,那么由此法拆解后的子数组为:
在这里插入图片描述
为什么要将一个数组分成N个大小为1的子序列呢?

可以发现,这些子序列都是有序的,那么将这些子序列进行有序合并,合并后的序列也就是有序的序列了。

相信大家再学高数的极限的时候都看过这么一句话:

一尺之捶,日取其半,万世不竭

意思就是将一个木棒,每天截取他的一半,永远都截不完。

当然数组是不会取不完的,如果将一个数组一直分成两半,最后就会得到一个元素组成的子序列。
在这里插入图片描述

现在有N个元素为1的子序列,将两两相邻的子序列合并成有序序列。直到所有子序列构成一个数组为止

例如:
在这里插入图片描述

归并排序

将前3个操作联系起来就能实现归并排序。

归并排序的定义如下:

设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或1的子序列,再两两合并……如此重复,直到得到一个长度为n的有序序列为止

归并排序的步骤如下:
(1)将整个数组二分递归,直到不可分为止(单数据序列)
(2)由递归堆栈开始合并有序序列,最后将合并完成的数组拷贝到原数组。

这里讲讲合并数组时的递归堆栈,先通过递归将整个数组拆分。
在这里插入图片描述
这个分解的方式与二叉树一致。完成分解之后就是将序列合并了。在调用堆栈的作用下,会将每个递归函数由下开始回溯。

在这里插入图片描述

归并排序的代码

void _MergeSort(int* a, int begin, int end,int* tmp)
{
	int mid = (begin + end) / 2;
	if (begin >= end)//不可再分,返回递归
	{
		return;
	}
	_MergeSort(a, begin, mid, tmp);
	_MergeSort(a, mid+1, end, tmp);


	int i = begin;

	//合并数组
	int begin1 = begin;//将原数组分为两部分,一部分是(begin,mid),另一部分是(mid+1,end)
	int end1 = mid;
	int begin2 = mid + 1;
	int end2 = end;

	while (begin1 <= end1 && begin2 <= end2)//合并有序数组
	{
		if (a[begin1] <= a[begin2])
		{
			tmp[i++] = a[begin1++];
		}
		else
		{
			tmp[i++] = a[begin2++];
		}
	}

	while (begin1 <= end1)//将剩余数据拷贝到临时数组
	{
		tmp[i++] = a[begin1++];
	}

	while (begin2 <= end2)//将剩余数据拷贝至临时数组
	{
		tmp[i++] = a[begin2++];
	}

	memmove(a+begin, tmp+begin, sizeof(int) * (end-begin + 1));//将合并的数组拷贝到原数组
}
void MergeSort(int* a, int n)
{
	int* tmp = (int*)malloc(sizeof(int) * n);//创建一个相等元素个数的数组、
	_MergeSort(a, 0, n - 1, tmp);
	free(tmp);
}

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

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

相关文章

AGILEFORMER:用于医学图像分割的空间敏捷 Transformer UNET

AGILEFORMER&#xff1a;用于医学图像分割的空间敏捷 Transformer UNET 摘要IntroductionMethodDeformable Patch Embedding2.1.1 Rigid patch embedding2.1.2 Deformable patch embedding Spatially Dynamic Self-AttentionDeformable Multi-head Self-Attention (DMSA)Neighb…

Java | Leetcode Java题解之第11题盛最多水的容器

题目&#xff1a; 题解&#xff1a; public class Solution {public int maxArea(int[] height) {int l 0, r height.length - 1;int ans 0;while (l < r) {int area Math.min(height[l], height[r]) * (r - l);ans Math.max(ans, area);if (height[l] < height[r]…

Docker之镜像与容器的相关操作

目录 一、Docker镜像 搜索镜像 下载镜像 查看宿主机上的镜像 删除镜像 二、Docker容器 创建容器 查看容器 启停容器 删除容器 进入容器 创建/启动/进入容器 退出容器 查看容器内部信息 一、Docker镜像 Docker 运行容器前需要本地存在对应的镜像&#xff0c; 如…

OWASP TOP10 漏洞详解

前言 该内容是 OWASP TOP 10 的学习笔记&#xff0c;笔记内容来源 B 站龙哥的视频【12.Top漏洞10&#xff1a;服务器请求伪造_哔哩哔哩_bilibili】 一、访问控制崩溃 概念 未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷访问未经授权的功能或数据&#xf…

一篇文章Linux技术急速入门,掌握这些命令可以解决日常 99% 的问题

一篇文章Linux技术急速入门&#xff0c;掌握这些命令可以解决日常 99% 的问题。 当你听到Linux[1]时&#xff0c;大多数人会想到只有程序员才会使用的复杂操作系统。但是&#xff0c;其实并非如此&#xff0c;虽然Linux给普通用户的感觉可能很深奥&#xff0c;需要很多操作命令…

逆向案例14——cnki学术翻译AES加密分析,涉及保持会话和获取token值

python代码&#xff1a; import execjs import requests UA "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" token_url "https://dict.cnki.net/fyzs-front-api/getToken" url …

测试工程师求职是选自研公司还是选外包公司呢?

大家好&#xff0c; 今天我们一起来聊一聊测试工程师求职是选自研公司&还是选外包公司呢&#xff1f; 今天来谈谈我的个人看法&#xff0c;作为一个在测试岗位上多年的我来说&#xff0c;自研公司比较好&#xff0c;外包公司其实也不会差。各自都有特点特色&#xff0c;根据…

能否安全地删除 Mac 资源库中的文件?

在管理Mac电脑存储空间时&#xff0c;用户确实可能考虑对资源库&#xff08;Library&#xff09;文件夹进行清理以释放空间。Mac资源库是一个系统及应用程序存放重要支持文件的地方&#xff0c;其中包括但不限于配置文件、临时文件、缓存、插件、偏好设置、应用程序支持数据等。…

Django路由配置

简单说一下django路由配置&#xff0c;发现很多同学出错。 首先&#xff0c;先创建自己的app文件&#xff08;用 python manage.py startapp myApp来创建自己的app&#xff09; 这个是自己 在Django的配置文件setting.py添加自己的项目文件myapp ok&#xff0c;此时就可以添加路…

JavaWeb后端——Mybatis

概述 Mybatis&#xff1a;Java程序来对数据库进行操作&#xff0c;一款优秀的持久层框架&#xff0c;用于简化JDBC的开发 SSM&#xff1a;SpringMVC、Spring、Mybatis 快速入门 步骤2&#xff1a;注意数据库连接的四要素 application.properties&#xff1a;springboot 的默…

百度富文本编辑器配置(vue3)

今天分享一下我做的项目里面的一个百度富文本的配置问题&#xff0c;安装配置流程以及如何解决的 1.首先是安装组件 # vue-ueditor-wrap v3 仅支持 Vue 3 npm i vue-ueditor-wrap3.x -S # or yarn add vue-ueditor-wrap3.x 2. 下载 UEditor UEditor 并不支持通过 npm 的方式…

mid格式是什么文件?怎么把mid转换成MP3?

MID&#xff08;Musical Instrument Digital Interface&#xff09;文件格式可以追溯到20世纪80年代&#xff0c;当时音频技术正在蓬勃发展。为了促进不同音乐设备之间的数据交流&#xff0c;MID格式应运而生。其初衷是作为一种标准的音乐数据传输协议&#xff0c;使得各类乐器…

C之结构体初始化10种写法总结(九十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

【NLP】关于BERT模型的一些认知

BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;模型是由Google在2018年提出的预训练Transformer模型&#xff0c;用于自然语言处理任务。 一. BERT模型的架构 1.1 输入表示 / Encoder模块 BERT中的Encoder模块是由三种Embedding&…

初识C++ · 类和对象(上)

目录 1.面向过程和面向对象初步认识 2.类的引入 3.类的定义 4.类的访问限定符及封装 4.1 访问限定符 4.2 封装 5.类的作用域 6.类的实例化 7.类的对象大小的计算 8.类成员函数的this指针 1.面向过程和面向对象初步认识 C语言是一门面向过程的语言&#xff0c;注重的…

ASP.Net添加Swagger注释

文章目录 Swagger添加Swagger注释 Swagger 添加Swagger注释 1、右击项目->选择属性->点击生成->输出&#xff0c;选中文档文件 2、配置服务 在program.cs 文件里配置SwaggerUI //增加项一 builder.Services.AddSwaggerGen(c> {c.SwaggerDoc("v1", ne…

pytorch 演示 tensor并行

pytorch 演示 tensor并行 一.原理二.实现代码 本文演示了tensor并行的原理。如何将二个mlp切分到多张GPU上分别计算自己的分块,最后做一次reduce。 1.为了避免中间数据产生集合通信,A矩阵只能列切分,只计算全部batch*seqlen的部分feature 2.因为上面的步骤每张GPU只有部分featu…

Leetcode刷题-哈希表详细总结(Java)

哈希表 当我们想使⽤哈希法来解决问题的时候&#xff0c;我们⼀般会选择如下三种数据结构。 数组set &#xff08;集合&#xff09;map&#xff08;映射&#xff09; 当我们遇到了要快速判断⼀个元素是否出现集合⾥的时候&#xff0c;就要考虑哈希法。如果在做⾯试题⽬的时候…

搭建好WordPress网站后的基本操作流程

考虑到很多朋友是第一次使用WordPress&#xff0c;这里给大家分享一下基本的WordPress操作流程&#xff0c;你可以跟着实际情况决定操作步骤。 1.设置网站SSL安全证书。 我采用的是Hostease家的Linux主机产品&#xff0c;自带免费SSL证书 。支持一键安装wordpress程序。 2.进…

智慧驿站式的“智慧公厕”,给城市新基建带来新变化

随着智慧城市建设的推进&#xff0c;智慧驿站作为一种多功能城市部件&#xff0c;正逐渐在城市中崭露头角。这些智慧驿站集合了智慧公厕的管理功能&#xff0c;为城市的新基建带来了全新的变革。本文以智慧驿站智慧公厕源头实力厂家广州中期科技有限公司&#xff0c;大量精品案…