当前位置: 首页 > article >正文

[数据结构]排序之 归并排序(有详细的递归图解)

一、非递归

基本思想:
归并排序( MERGE-SORT )是建立在归并操作上的一种有效的排序算法 , 该算法是采用分治法( Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并排序核心步骤:
归并:如果左区间和右区间都有序,那么一次比较,小的尾插到新空间,链表可以摘下来插入,数组不行,得借助新空间
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void _MergeSort(int* a, int begin, int end, int* temp)
{if (begin>=end)return;int mid = (begin + end) / 2;//[begin,mid] [mid+1,end]如果这两个区间有序,那么可以归并了_MergeSort(a, begin, mid, temp);_MergeSort(a, mid+1, end, temp);//[begin, mid] [mid + 1, end]归并int begin1 = begin, end1 = mid;int begin2 = mid+1, end2 = end;int i = begin;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){temp[i] = a[begin1];i++;begin1++;}else{temp[i] = a[begin2];i++;begin2++;}}//谁没结束谁++来拷贝,由于不知道是哪个区间没有结束,所有都写一遍while (begin1 <= end1){temp[i] = a[begin1];i++;begin1++;}while (begin2 <= end2){temp[i] = a[begin2];i++;begin2++;}//等把所有数都放到temp数组上时,再拷贝回去memcpy(a+begin, temp+begin,sizeof(int)*(end-begin+1));
}
void MergeSort(int* a, int n)
{int* temp = (int*)malloc(sizeof(int) * n);if (temp == NULL){perror("malloc fail\n");return;}_MergeSort(a, 0, n - 1, temp);free(temp);
}
int main()
{int a[] = {10,6,7,1,3,9,4,2 };MergeSort(a,8);for (int i = 0; i < 8; i++){printf("%d ", a[i]);}return 0;
}

注:以下图片看不清楚可以点进去放大看

二、递归 

不能用栈,栈是前序,而归并是后序
方法:
能不能依次依次往后算?算完第一个和第二个后算第三个和第四个,再算第五个和第六个.......
第一次归完后再拷贝回去后四个四个一归.....

必须得注意细节:如果是奇数个数那么得注意边界

 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
void Swap(int* a, int* b)
{int temp = *a;*a = *b;*b = temp;
}
void _MergeSort(int* a, int begin, int end, int* temp)
{if (begin >= end)return;int mid = (begin + end) / 2;//[begin,mid] [mid+1,end]如果这两个区间有序,那么可以归并了_MergeSort(a, begin, mid, temp);_MergeSort(a, mid + 1, end, temp);//[begin, mid] [mid + 1, end]归并int begin1 = begin, end1 = mid;int begin2 = mid + 1, end2 = end;int i = begin;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){temp[i] = a[begin1];i++;begin1++;}else{temp[i] = a[begin2];i++;begin2++;}}//谁没结束谁++来拷贝,由于不知道是哪个区间没有结束,所有都写一遍while (begin1 <= end1){temp[i] = a[begin1];i++;begin1++;}while (begin2 <= end2){temp[i] = a[begin2];i++;begin2++;}//等把所有数都放到temp数组上时,再拷贝回去memcpy(a + begin, temp + begin, sizeof(int) * (end - begin + 1));
}
void MergeSort(int* a, int n)
{int* temp = (int*)malloc(sizeof(int) * n);if (temp == NULL){perror("malloc fail\n");return;}int gap = 1;while (gap < n){for (int i = 0; i < n; i += 2 * gap){int begin1 = i, end1 = i + gap - 1;int begin2 = i + gap, end2 = i + 2 * gap - 1;int j = i;while (begin1 <= end1 && begin2 <= end2){if (a[begin1] < a[begin2]){temp[j] = a[begin1];j++;begin1++;}else{temp[j] = a[begin2];j++;begin2++;}}//谁没结束谁++来拷贝,由于不知道是哪个区间没有结束,所有都写一遍while (begin1 <= end1){temp[j] = a[begin1];j++;begin1++;}while (begin2 <= end2){temp[j] = a[begin2];j++;begin2++;}//等把所有数都放到temp数组上时,再拷贝回去memcpy(a + begin, temp + begin, sizeof(int) * (end - begin + 1));}gap *= 2;}free(temp);
}
int main()
{int a[] = {10,6,7,1,3,9,4,2 };MergeSort(a,8);for (int i = 0; i < 8; i++){printf("%d ", a[i]);}return 0;
}

 

相关文章:

[数据结构]排序之 归并排序(有详细的递归图解)

一、非递归 基本思想&#xff1a; 归并排序&#xff08; MERGE-SORT &#xff09;是建立在归并操作上的一种有效的排序算法 , 该算法是采用分治法&#xff08; Divide andConquer&#xff09;的一个非常典型的应用。将已有序的子序列合并&#xff0c;得到完全有序的序列&#x…...

构建第二个Django的应用程序

构建第二个应用程序 文章目录 构建第二个应用程序1.打开Visual Studio code 左上角 点击fike 点击open folder2.打开上次的Django项目 并按图示点击进入终端3.在下方终端输入创建app01项目的命令 接着在左上方会出现一个app01的项目4.接着在Hellodjango的项目里settings.py中定…...

axios 请求拦截器和 响应拦截器总结

请求拦截器 和 响应拦截器 是 axios 提供的强大功能&#xff0c;用于在请求发送前和响应返回后统一处理某些逻辑。它们的作用和具体用法如下&#xff1a; 1. 请求拦截器 作用 在请求发送之前&#xff0c;对请求配置进行统一处理。例如&#xff1a; 添加请求头&#xff08;如…...

图像分割的mask有空洞怎么修补

分享一个对实例分割mask修补的方法&#xff0c;希望对大家有所帮助。 1. 这是我准备分割的图片 2 分割结果 可以看到衣服部分有一些没分割出来&#xff0c;二值化图片能清晰看到衣服部分有些黑色未分出的地方。 3 补全mask区域 import cv2 import numpy as npdef fill_mask_h…...

HarmonyOS NEXT 组件状态管理的对比

在HarmonyOS NEXT开发中&#xff0c;组件状态管理是构建动态用户界面的核心。本文将深入探讨State、Prop、Link和ObjectLink这四种常见的状态管理装饰器&#xff0c;并通过示例代码进行对比分析&#xff0c;以帮助同学们更好地理解和选择合适的状态管理方式。 一、装饰器概述 …...

C#通过API接口返回流式响应内容---SignalR方式

1、背景 在上两篇《C#通过API接口返回流式响应内容—分块编码方式》和《C#通过API接口返回流式响应内容—SSE方式》实现了流式响应的内容。 上面的这两个主要是通过HTTP的一些功能&#xff0c;除了这些之外&#xff0c;还有WebSocket的方式。C#中的WebSocket的有比较多的方案&…...

vulhub靶机----基于docker的初探索,环境搭建

环境搭建 首先就是搭建docker环境&#xff0c;这里暂且写一下 #在kali apt update apt install docker.io配置docker源&#xff0c;位置在/etc/docker/daemon.json {"registry-mirrors": ["https://5tqw56kt.mirror.aliyuncs.com","https://docker…...

P1659 [国家集训队] 拉拉队排练 (manacher 算法)

P1659 [国家集训队] 拉拉队排练 - 洛谷 这题需要求前k大的回文子串的长度的乘积。因为n的大小为1e6 &#xff0c;所以我们只能使用manacher 线性的来找到所有的回文子串。 其中长度大的回文子串可以包含小的回文子串&#xff0c;所以其实我们只需要知道以每一个位置为回文中心…...

Redis命令详解--集合

Redis set 是string类型的无序集合。集合成员是唯一的&#xff0c;这就意味着集合中不能出现重复的数据&#xff0c;常用命令&#xff1a; SADD key member1 [member2...] 向集合添加一个或多个成员 SREM key member1 [member2...] 移除集合中一个或多个成员 SMEMBERS key 获…...

AI对话框实现

请注意&#xff0c;功能正在开发中&#xff0c;代码和注释不全 场景&#xff1a;AI对话框实现&#xff0c;后端调用AI大模型。前端发送请求后端返回流式数据&#xff0c;进行一问一答的对话功能&#xff08;场景和现在市面上多个AI模型差不多&#xff0c;但是没人家功能健全&a…...

可视化图解算法:删除链表中倒数第n个节点

1. 题目 描述 给定一个链表&#xff0c;删除链表的倒数第 n 个节点并返回链表的头指针 例如&#xff0c; 给出的链表为: 1→2→3→4→5, n 2. 删除了链表的倒数第 n 个节点之后,链表变为1→2→3→5. 数据范围&#xff1a; 链表长度 0≤n≤1000&#xff0c;链表中任意节点的…...

智能汽车图像及视频处理方案,支持视频智能拍摄能力

美摄科技&#xff0c;作为智能汽车图像及视频处理领域的先行者&#xff0c;凭借其卓越的技术实力和前瞻性的设计理念&#xff0c;为全球智能汽车制造商带来了一场视觉盛宴的革新。我们自豪地推出——美摄科技智能汽车图像及视频处理方案&#xff0c;一个集高效性、智能化、画质…...

如何根据 CUDA 配置安装 PyTorch 和 torchvision(大模型 环境经验)

目录 前言1. CUDA2. 环境配置前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 写过ubuntu的配置安装:Ubuntu安装配置Cuda和Pytorch gpu 以下针对Window,如何通过Cuda配置对应版本,安装大模型环境! 代码有配置包,直接执行:pip install -r requi…...

微信小程序的业务域名配置(通过ingress网关的注解)

一、背景 微信小程序的业务域名配置&#xff08;通过kong网关的pre-function配置&#xff09;是依靠kong实现&#xff0c;本文将通过ingress网关实现。 而我们的服务是部署于阿里云K8S容器&#xff0c;当然内核与ingress无异。 找到k8s–>网络–>路由 二、ingress注解 …...

自学Python创建强大AI:从入门到实现DeepSeek级别的AI

人工智能&#xff08;AI&#xff09;是当今科技领域最热门的方向之一&#xff0c;而Python是AI开发的首选语言。无论是机器学习、深度学习还是自然语言处理&#xff0c;Python都提供了丰富的库和工具。如果你梦想创建一个像DeepSeek这样强大的AI系统&#xff0c;本文将为你提供…...

Matlab 舰载机自动着舰控制系统研究

1、内容简介 Matlab 188-舰载机自动着舰控制系统研究 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...

【华为OD-E卷 -123 判断一组不等式是否满足约束并输出最大差 100分(python、java、c++、js、c)】

【华为OD-E卷 - 判断一组不等式是否满足约束并输出最大差 100分(python、java、c++、js、c)】 题目 给定一组不等式,判断是否成立并输出不等式的最大差(输出浮点数的整数部分) 要求: 不等式系数为 double类型,是一个二维数组 不等式的变量为 int类型,是一维数组; 不等式…...

剑指 Offer II 113. 课程顺序

comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20113.%20%E8%AF%BE%E7%A8%8B%E9%A1%BA%E5%BA%8F/README.md 剑指 Offer II 113. 课程顺序 题目描述 现在总共有 numCourses 门课需要选&#xff0c;记为 0 到 n…...

小科普《DNS服务器》

DNS服务器详解 1. 定义与核心作用 DNS&#xff08;域名系统&#xff09;服务器是互联网的核心基础设施&#xff0c;负责将人类可读的域名&#xff08;如www.example.com&#xff09;转换为机器可识别的IP地址&#xff08;如192.0.2.1&#xff09;&#xff0c;从而实现设备间的…...

嵌入式硬件篇---WIFI模块

文章目录 前言一、核心工作原理1. 物理层&#xff08;PHY&#xff09;工作频段2.4GHz5GHz 调制技术直接序列扩频正交频分复用高效数据编码 2. 协议栈架构MAC层Beacon帧4次握手 3. 核心工作模式 二、典型应用场景1. 智能家居系统远程控制环境监测视频监测 2. 工业物联网设备远程…...

WindowsAD域服务权限提升漏洞

WindowsAD 域服务权限提升漏洞&#xff08;CVE-2021-42287, CVE-2021-42278&#xff09; 1.漏洞描述 Windows域服务权限提升漏洞&#xff08;CVE-2021-42287, CVE-2021-42278&#xff09;是由于Active Directory 域服务没有进行适当的安全限制&#xff0c;导致可绕过安…...

Oracle常见系统函数

一、字符类函数 1&#xff0c;ASCII(c)和CHR(i)字符串和ascii码互转换 SQL> select ascii(Z) ,ascii(H),ascii( A) from dual;ASCII(Z) ASCII(H) ASCII(A) ---------- ---------- ----------90 72 32SQL> select chr(90),chr(72),chr(65) from dual;C…...

甘特图dhtmlx-gantt 一行多任务

继上篇进行修改 dhtmlxGantt 甘特图 一行展示多条任务类型_dhtmlxgantt多个任务显示在一行-CSDN博客 主要修改 getProductData 数据部分&#xff1a; 数据中添加&#xff1a; render: "split", //允许任务在同一行中拆分显示&#xff0c; parent: "1",…...

docker配置国内镜像站链接

修改这个文件 sudo vi /etc/docker/daemon.json将镜像站的链接放在里面&#xff0c;如果大于等于两个用逗号分隔 { "registry-mirrors": ["https://docker.1panel.live"] }使配置生效 sudo systemctl daemon-reload sudo systemctl restart docker条件允…...

Flutter 学习之旅 之 flutter 使用 SQLite(sqflite) 实现简单的数据本地化 保存/获取/移除/判断是否存在 的简单封装

Flutter 学习之旅 之 flutter 使用 SQLite&#xff08;sqflite&#xff09; 实现简单的数据本地化 保存/获取/移除/判断是否存在 的简单封装 目录 Flutter 学习之旅 之 flutter 使用 SQLite&#xff08;sqflite&#xff09; 实现简单的数据本地化 保存/获取/移除/判断是否存在…...

【leetcode hot 100 208】实现Trie(前缀树)

解法一&#xff1a;字典树 Trie&#xff0c;又称前缀树或字典树&#xff0c;是一棵有根树&#xff0c;其每个节点包含以下字段&#xff1a; 指向子节点的指针数组 children。对于本题而言&#xff0c;数组长度为 26&#xff0c;即小写英文字母的数量。此时 children[0] 对应小…...

Pytest的夹具共享(2)

1、问题&#xff1a;夹具跟用例都是写在一个py文件中&#xff0c;在自动化框架中&#xff0c;测试用例、夹具在不同的文件中&#xff0c;跨文件夹具使用呢&#xff1f; “”" 在XXX测试用例模块中&#xff0c;使用夹具&#xff1f; 如何跨文件调用&#xff1f; -1&#x…...

前端安全之DOMPurify基础使用

DOMPurify时一款专门用于防御XSS攻击的库&#xff0c;通过净化HTML的内容&#xff0c;移除恶意脚本&#xff0c;同时保留安全的HTML标签和数学。以下是基础使用指南&#xff0c;涵盖基础的安装与用法。 1&#xff0c;安装DOMPurify 通过npm或yarn安装 npm install dompurify …...

鸿蒙 元服务摘要

元服务&#xff08;原名原子化服务&#xff09;&#xff0c;是HarmonyOS提供的一种面向未来的服务提供方式&#xff0c;是有独立入口的&#xff08;用户可通过点击方式直接触发&#xff09;、免安装的&#xff08;无需显式安装&#xff0c;由系统程序框架后台安装后即可使用&am…...

【css酷炫效果】纯CSS实现粒子旋转动画

【css酷炫效果】纯CSS实现粒子旋转动画 缘创作背景html结构css样式完整代码效果图 想直接拿走的老板&#xff0c;链接放在这里&#xff1a;https://download.csdn.net/download/u011561335/90492008 缘 创作随缘&#xff0c;不定时更新。 创作背景 刚看到csdn出活动了&…...