当前位置: 首页 > 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.jsqmd.com/news/895502/

相关文章:

  • 会议平板哪家好:前五排名 专业深度测评 - 服务品牌热点
  • Embedding 到底是什么:从词向量到句子向量、相似度与局限性
  • 【运维心得】彩色喷墨“只打彩色不打黑”?一招搞定
  • Linux入门篇之启动流程与Vscode远程连接RK3588
  • 2026年4月汽流粉碎机生产厂家哪个好,合金模具/拉伸模具/钛合金模具/粉末冶金模具,汽流粉碎机订做厂家怎么选择 - 品牌推荐师
  • TranslucentTB安装问题解决方案:从错误0x80073D05到完美任务栏透明化
  • 现代作品集重构指南:从展示到论证,打造高价值个人品牌
  • OpenClaw安装后源码精读20260505版本
  • Git2Social:用AI将Git提交自动转化为技术社交媒体内容
  • 2026年知网、维普AIGC检测差距大?论文AI检测该信谁?附4款收藏降重工具 - 降AI实验室
  • 【CGLIB】如何使用 `Dispatcher` 和 `LazyLoader` 实现延迟加载或动态切换代理逻辑?
  • 嵌入式学习之路->stm32篇->(15)通用定时器(下)
  • 从调参到调系统:LangSmith如何重塑LLM应用调试与优化方法论
  • Steam成就管理新维度:5分钟掌握SAM工具的核心功能与应用场景
  • 跨境电商产品变体匹配:LLM、Embedding、CV与规则引擎的混合架构实践
  • 考研二战集训营推荐,资质齐全靠谱之选? - mypinpai
  • skynet——服务发现学习
  • AI重塑税务文档处理:从OCR到智能分类的自动化实践
  • 阴阳师自动化脚本:20+任务智能托管,解放双手的终极解决方案
  • 嵌入式学习之路->stm32篇->(16)高级定时器
  • 20253921 2025-2026-2 《网络攻防实践》第九周作业
  • Windows Subsystem for Android 技术架构深度解析与高级配置指南
  • Windows驱动管理终极指南:用RAPR工具实现系统驱动的快速清理与优化
  • 5分钟掌握AMD Ryzen隐藏性能:SMUDebugTool实战指南
  • 混合CMOS-忆阻器仲裁器PUF设计与硬件安全应用
  • 实战经验:如何修复 MariaDB 因 InnoDB 损坏导致的启动失败 (status=6/ABRT)
  • ThinkPad风扇控制终极指南:如何用TPFanCtrl2实现完美散热
  • Zotero与Scholaread协同的AI文献阅读系统:联动设置、对照式翻译与文献高效管理 - nut-king
  • 构建AI智能体信任基础设施:从技能验证到支付结算的完整方案
  • 终极指南:如何快速逆向Wallpaper Engine资源并提取TEX纹理