news 2026/4/18 13:54:22

排序算法-归并排序

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
排序算法-归并排序

在学习归并排序之前,个人认为需要掌握双指针的相关知识(快慢指针,左右指针之类的)。

归并排序是一种运用快慢指针与递归来实现的算法

思路

拆分过程-“归”的过程

对于数组:

5 4 3 2 1

我们先把其分为两部分:

5 4 和 3 2 1 //两个都可以,看你选择

5 4 3 和 2 1 //两个都可以,看你选择

然后再对于左右两部分再次拆分,直到分成一个元素

而这个过程,我们可以运用递归来进行数组的拆分

f(0 , 4)->f(0 , 2) + f(3 , 4)->f(0 , 1) + f(2 , 2) + f(3 , 3) + f(4, 4) //返回的是边界下标

而我们就可以利用这个过程将大数组转换成小数组,最终得到一个有序的数组

排序过程-“并”的过程

我们取递归返回的其中一个过程为例:

3 4 5 和 1 2

我们定义一个临时变量来存储部分排序好的元素,假设这个变量为temp

我们先比较 3 和 1,发现 1 比较小

于是我们把 1 放入temp

继续比较 3 和 2 , 发现 2 比较小

于是我们把 2 放入temp

这个时候右数组到头了,于是我们停止比较,并且把左数组剩下的元素全放到temp里面去

于是我们得到的temp就是

1 2 3 4 5

然后我们将temp赋值给原数组,把原数组覆盖掉

我们明显可以发现,和原来相比较,原数组更加有序了(已经有序了,我们取的是排序的最后一步)

代码实现

#include<iostream> using namespace std; const int N = 1e5; int arr[N]; int temp[N]; //辅助数组 void merge_sort(int l , int r){ //递归实现归并排序 if(l >= r) return; //只有一个元素或者没有,自然有序,不用管 int m = (l + r) / 2; //这里就是把数组拆开 merge_sort(l , m); //处理左边 merge_sort(m + 1 , r); //处理右边 int i = l , j = m + 1 , k = 0; //i和j分别代表左右数组的左边界起点 k是临时变量,作为temp数组的边界 while(i <= m && j <= r){ if(arr[i] > arr[j]){ temp[k] = arr[j]; //把小的数放进来 k++; j++; }else{ temp[k++] = arr[i++]; } } //接下来判断i和j哪个没走完,把剩下的元素放进去 while(i <= m) temp[k++] = arr[i++]; while(j <= r) temp[k++] = arr[j++]; //然后把temp覆盖arr,即把temp重新赋值给arr,arr的起始位置是l和r,temp的起始位置是0 for(i = l , k = 0 ; i <= r ; i++ , k++){ arr[i] = temp[k]; } } int main(){ int n; cin >> n; for(int i = 0 ; i < n ; i++){ cin >> arr[i]; } merge_sort(0 , n - 1); //将左边界和右边界传入 for(int i = 0 ; i < n ; i++){ cout << arr[i] << ' '; } cout << endl; return 0; }

总结

归并排序的整体难度起始不大,然后复杂度和稳定性这两个方面的话,我不清楚这个复杂度是怎么算出来的,但是我查出来是O()。归并排序不是一个稳定的算法,因为临时数组会反复地把原数组进行覆盖。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 11:05:35

使用网站内容进行多渠道品牌营销的主要优势

什么是多渠道营销&#xff1f;在选择服务提供商时&#xff0c;人们使用不同的方式来查找信息并与他们联系。有些人更喜欢网站&#xff0c;有些人则使用社交媒体或电子邮件。网站对于数字存在仍然至关重要&#xff0c;但跨多个渠道管理内容现在至关重要。多渠道营销以客户喜欢的…

作者头像 李华
网站建设 2026/4/17 9:09:26

自动化测试ROI计算实例:从成本量化到战略决策

1. ROI计算核心框架1.1 基本计算公式ROI&#xff08;投资回报率&#xff09; &#xff08;收益 - 成本&#xff09;/ 成本 100%对于自动化测试场景&#xff0c;需进一步拆解&#xff1a;总收益 手动测试成本节约 缺陷早期发现收益 测试周期压缩收益 回归测试复用收益总成…

作者头像 李华
网站建设 2026/4/18 5:34:46

MNIST-手写数字识别分类案例

import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim from torch.utils.data import TensorDataset, DataLoader import gzip import pickle from pathlib import Path import numpy as np# 定义数据根目录路径 DATA_PATH Path(…

作者头像 李华
网站建设 2026/4/18 8:51:25

Langchain-Chatchat问答系统灰度期间服务优雅启停

Langchain-Chatchat问答系统灰度期间服务优雅启停 在企业级AI应用逐步从实验走向生产落地的今天&#xff0c;一个看似不起眼但至关重要的工程细节正悄然决定着系统的可靠性——如何在不中断用户体验的前提下完成服务升级&#xff1f;尤其是在部署像 Langchain-Chatchat 这类基于…

作者头像 李华
网站建设 2026/4/18 1:19:54

Langchain-Chatchat结合Argo CD实现GitOps部署

Langchain-Chatchat 结合 Argo CD 实现 GitOps 部署 在企业智能化转型的浪潮中&#xff0c;如何安全、可靠、可追溯地部署基于大语言模型&#xff08;LLM&#xff09;的知识管理系统&#xff0c;正成为 DevOps 与 AI 工程化交叉领域的重要课题。传统方式下&#xff0c;本地知识…

作者头像 李华
网站建设 2026/4/17 10:38:26

Austroads:车速管理研究综述:实证依据与指导建议(英) 2025

该报告是 Austroads 为更新《道路安全指南第 3 部分&#xff1a;安全车速》而开展的研究综述&#xff0c;核心是整合车速管理的最新实证与实践经验&#xff0c;为澳大拉西亚地区道路安全政策提供支撑。一、研究背景与目标背景&#xff1a;现有指南需纳入国际前沿方法&#xff0…

作者头像 李华