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

归并排序的知识

一.什么是归并排序?

归并排序是一种基于分治思想的高效,稳定的排序算法,是算法竞赛中非常常用的排序方法,也是求逆序对的经典算法

二.归并排序的核心思想

核心思想是分治思想,分而治之;它的流程可以拆分为3步:

1.分:把待排序的数组从中间一分为二,递归地左右两个子数组接着拆分,直到每个子数组只有一个元素(天然有序)

2.治:递归地对左右两个子数组进行排序

3.合:把两个已经排好序的子数组合并成一个完整的有序数组

三.如何实现归并排序?

以merge(l,r)为例:

1.递归终止条件:

if(l>=r) return ;

当区间只有一个元素时,l==r,或者区间非法,l>r时,直接返回,不需要排序

2.分:拆成两半

int mid=(l+r)/2;

merge(l,mid);

merge(mid+1,r);

先递归把左半段【l,mid】排好序,再递归把右半段【mid+1,r】排好序。递归到底层后,左右两端都是有序数组

3.合:合并两个有序数组(核心)

int i=l,j=mid+1,k=l;

while(i<=mid&&j<=r){

if(a[i]<=a[j])

tmp[k++]=a[i++];

else{

tmp[i++]=a[j++];

ans+=mid-i+1;}

}

两个指针i,j分别指向左右两端的开头,k指向临时数组tmp的写入位置;每次把两个指针指向的较小值,写入tmp:若a【i】<=a【j】,说明a【i】<a【j】,不会产生逆序对,直接写入tmp;若a【i】>a【j】,说明a【j】比左半段从i到mid的所有元素都小,会产生mid-i+1个逆序对,写入tmp并更新ans

4.收尾:拷贝剩余元素

while(i<=mid) tmp[k++]=a[i++];

while(j<=r) tmp[k++]=a[j++];

for(int p=l;p<=r;p++)

a[p]=tmp[p];

把左右两端中剩下的元素直接写入tmp,把tmp中合并好的有序数组,拷贝回原数组a,供上一层递归使用

四.完整可运行代码

#include <bits/stdc++.h>

using namespace std;

const int N = 500010;

int a[N], tmp[N];

long long ans = 0; // 逆序对数量可能很大,必须用

long long void merge(int l, int r)

{

if(l >= r) return;

int mid = (l + r) /2;

merge(l, mid);

merge(mid + 1, r);

int i = l, j = mid + 1, k = l;

while(i <= mid && j <= r)

{ if(a[i] <= a[j])

{ tmp[k++] = a[i++]; }

else

{ tmp[k++] = a[j++];

ans += mid - i + 1; // 统计逆序对 } }

while(i <= mid)

tmp[k++] = a[i++];

while(j <= r) tmp[k++] = a[j++];

for(int p = l; p <= r; p++) a[p] = tmp[p];

}

int main() {

ios::sync_with_stdio(false);

cin.tie(0);

int n;

cin >> n;

for(int i = 1; i <= n; i++)

{

cin >> a[i];

}

merge(1, n);

cout << ans << endl;

return 0; }

http://www.rkmt.cn/news/1400550.html

相关文章:

  • 2026年4月汽流粉碎机生产厂家哪个好,合金模具/拉伸模具/钛合金模具/粉末冶金模具,汽流粉碎机订做厂家怎么选择 - 品牌推荐师
  • OpenClaw安装后源码精读20260505版本
  • 【译】《心悟内核:先懂设计,再读代码》—3、代码之前:一张内核概念图
  • 【CGLIB】如何使用 `Dispatcher` 和 `LazyLoader` 实现延迟加载或动态切换代理逻辑?
  • 考研二战集训营推荐,资质齐全靠谱之选? - mypinpai
  • 线下实体店怎么做GEO优化引流
  • 3步掌握哔哩下载姬DownKyi:免费下载B站8K高清视频的终极指南
  • 基于Node.js的本地RAG应用构建:从文档处理到智能问答
  • 终极指南:Windows Subsystem for Android 完全配置与优化教程
  • 混合CMOS-忆阻器仲裁器PUF设计与硬件安全应用
  • 终极Windows驱动清理指南:如何用DriverStore Explorer一键释放磁盘空间
  • ThinkPad风扇控制终极指南:如何用TPFanCtrl2实现完美散热
  • Zotero与Scholaread协同的AI文献阅读系统:联动设置、对照式翻译与文献高效管理 - nut-king
  • 如何免费解锁Minecraft世界的终极数据编辑神器:NBTExplorer完全指南
  • Web3工程师薪酬变革:代币预算体系的设计与落地实践
  • AI编程助手知识管理:从对话记录到可复用代码资产库
  • TVA编码器微形变敏感度量化评估
  • 【Linux】 一文搞懂应用层协议HTTPS:从加密原理到完整工作流程
  • 基于OCR与LLM的终端智能助手:让AI在屏幕上行走的工程实践
  • 研究生必备|8款文献翻译免费软件深度测评,Scholaread免费版竟然能做到这个程度 - nut-king
  • 别再只抄官方文档了!ElementUI Transfer穿梭框实战:从数据绑定到表单验证的完整避坑指南
  • 深入理解软件重用:从概念到实践
  • 革命性AI视频字幕去除工具:Video-subtitle-remover一站式解决方案
  • 智能体系统架构设计:在随机性与确定性间建立清晰边界
  • 【C#vsPython·第一阶段】变量声明这件事,C# 和 Python 差了十万八千里
  • 别再乱编译OpenSSL了!聊聊CentOS/RHEL 8里那些‘魔改’的系统库依赖
  • 从 Shadow AI 到企业级工作流治理:技术团队怎么落地
  • C++编程中的命名空间基本知识讲解
  • 2026 年6月国内怎么开通 ChatGPT Plus?苹果、安卓、虚拟卡、合租、代充一次说清
  • 终极指南:5分钟快速上手AzurLaneAutoScript,彻底解放你的碧蓝航线游戏时间