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

归并排序,归并分治

先看归并排序,归并排序就是先排左,再排右,然后把这两部分merge在一起,时间复杂度是O(nlogn)的。

额外空间复杂度O(n);

1)左部分排好序、右部分排好序、利用merge过程让左右整体有序

2)merge过程:谁小拷贝谁,直到左右两部分所有的数字耗尽,拷贝回原数组

void merge(int l, int m, int r)
{int ai = l, bi = m + 1;int i = l;while (ai <= m && bi <= r){help[i++] = a[ai] <= a[bi] ? a[ai++] : a[bi++];}while (ai <= m){help[i++] = a[ai++];}while (bi <= r){help[i++] = a[bi++];}for (int i = l; i <= r; i++){a[i] = help[i];}
}
void wo(int l, int r)
{if (l >= r)return;int mid = l + ((r - l) >> 1);wo(l, mid);wo(mid + 1, r);merge(l, mid, r);
}
void solve()
{cin >> n;a.resize(n + 1);help.resize(n + 1);for (int i = 1; i <= n; i++){cin >> a[i];}wo(1, n);for (int i = 1; i <= n; i++){cout << a[i] << ' ';}
}

也有非递归的版本

void merge(int l, int m, int r)
{int ai = l, bi = m + 1;int i = l;while (ai <= m && bi <= r){help[i++] = a[ai] <= a[bi] ? a[ai++] : a[bi++];}while (ai <= m){help[i++] = a[ai++];}while (bi <= r){help[i++] = a[bi++];}for (int i = l; i <= r; i++){a[i] = help[i];}
}
void solve()
{cin >> n;a.resize(n + 1);help.resize(n + 1);for (int i = 1; i <= n; i++){cin >> a[i];}for (int step = 1; step <= n; step *= 2){l = 0;while (l <= n){m = l + step - 1;if (m + 1 > n){break;}r = min(n, l + (step << 1) - 1);merge(l, m, r);l = r + 1;}}for (int i = 1; i <= n; i++){cout << a[i] << ' ';}
}

这里使用了归并分治的思想。

归并分治
原理:

1)思考一个问题在大范围上的答案,是否等于,左部分的答案 + 右部分的答案 + 跨越左右产生的答案

2)计算“跨越左右产生的答案”时,如果加上左、右各自有序这个设定,会不会获得计算的便利性

3)如果以上两点都成立,那么该问题很可能被归并分治解决(话不说满,因为总有很毒的出题人)

4)求解答案的过程中只需要加入归并排序的过程即可,因为要让左、右各自有序,来获得计算的便利性

举两个例子

https://www.nowcoder.com/practice/edfe05a1d45c4ea89101d936cac32469

这里的小和就可以两部分分别计算,然后合并的时候再用双指针跑一遍,发现双指针只需要遍历一遍,所以完全可以用归并分治。

```cpp
void merge(int l, int m, int r)
{int ai = l, bi = m + 1;int sum = 0;for (int i = bi; i <= r; i++){while (ai <= m){if (a[ai] <= a[i]){sum += a[ai];ai++;}else{break;}}ans += sum;}ai = l, bi = m + 1;int i = l;while (ai <= m && bi <= r){help[i++] = a[ai] <= a[bi] ? a[ai++] : a[bi++];}while (ai <= m){help[i++] = a[ai++];}while (bi <= r){help[i++] = a[bi++];}for (int i = l; i <= r; i++){a[i] = help[i];}
}
void wo(int l, int r)
{if (l >= r)return;int mid = l + ((r - l) >> 1);wo(l, mid);wo(mid + 1, r);merge(l, mid, r);
}
void solve()
{cin >> n;a.resize(n + 1);help.resize(n + 1);for (int i = 1; i <= n; i++){cin >> a[i];}wo(1,n);cout << ans << endl;
}

再举一个例子,

https://www.luogu.com.cn/problem/P1908

著名的逆序对,差不多的套路,以前我是用树状数组做,现在用这个,hhh其实都是差不多的思想

双指针跑一遍,判断左指针是否大于右指针就行了

void merge(int l, int m, int r)
{int ai = l, bi = m + 1;int sum = 0;for (int i = ai; i <= m; i++){while (bi <= r){if (a[i] > a[bi]){sum++;bi++;}else{break;}}ans += sum;}ai = l, bi = m + 1;int i = l;while (ai <= m && bi <= r){help[i++] = a[ai] <= a[bi] ? a[ai++] : a[bi++];}while (ai <= m){help[i++] = a[ai++];}while (bi <= r){help[i++] = a[bi++];}for (int i = l; i <= r; i++){a[i] = help[i];}
}
void wo(int l, int r)
{if (l >= r)return;int mid = l + ((r - l) >> 1);wo(l, mid);wo(mid + 1, r);merge(l, mid, r);
}
void solve()
{cin >> n;a.resize(n + 1);help.resize(n + 1);for (int i = 1; i <= n; i++){cin >> a[i];}wo(1, n);cout << ans << endl;
}
http://www.jsqmd.com/news/427960/

相关文章:

  • 非统一内存访问架构NUMA的是是非非
  • 2026年评价高的西安电力行业低温电池/高安全性低温电池品牌厂家哪家靠谱 - 行业平台推荐
  • 263_尚硅谷_goroutine的基本介绍
  • 2026年精选工单系统推荐,适配大型企业与零售行业,高效协同优选 - 品牌2026
  • 2026年评价高的高端职业装定制设计/广州职业装定制销售厂家哪家好 - 行业平台推荐
  • 易基因:代码分享|基于TCGA甲基化数据挖掘验证分子表型代码分享(第二期)
  • 前端如何实现CKEditor的Word图片批量粘贴且保留格式?
  • 15t果蔬高效打浆机设计
  • MySQL优化方法
  • 2026年高品质的木建筑模板/覆膜板建筑模板正规生产厂家推荐 - 行业平台推荐
  • 2026年比较好的LXB(K)-10型电流互感器/JSZWF12-10R型电压互感器专业制造厂家推荐 - 行业平台推荐
  • 2026年3月圆柱模厂家推荐,工程建筑模板综合实力口碑盘点 - 品牌鉴赏师
  • 国产化OA系统如何集成HTML+PHP支持视频文件的分片版本对比?
  • 芯片制造企业如何选择PDF转Word格式方案?
  • 2026年度口碑好的有经验的GEO服务机构盘点,多维度对比哪家强 - 工业设备
  • 2026年比较好的微型减速电机/斜齿轮减速电机长期合作厂家推荐 - 行业平台推荐
  • 2026年深圳比较好的配眼镜公司推荐,价格贵不贵 - 工业品牌热点
  • HGVE-2024-E004、HGVE-2024-E005、HGVE-2024-E006、HGVE-2024-E007
  • 照抄 OpenAI 工程师的 Codex 用法:一套可直接复制的 Prompt 工作流
  • 2026年评价高的南京大型空压机/二手空压机制造厂家哪家靠谱 - 行业平台推荐
  • 聊聊启程国旅售后服务好吗,费用性价比高不高 - 工业品网
  • 惊!一个表情符号就能劫持 RAG 系统?KDD 2026 最新研究揭露 RAG 符号扰动漏洞
  • 2026年3月伺服液压系统厂家推荐,响应快精度高液压系统优选 - 品牌鉴赏师
  • 2026年3月防雷检测报告办理公司推荐,报告通过率高靠谱机构 - 品牌鉴赏师
  • 27th斗式提升机结构设计
  • 从KPI到OKR再到持续反馈,2026年绩效系统选型你必须知道的五件事
  • 易基因:代码分享|基于TCGA甲基化数据挖掘验证分子表型代码分享
  • API安全
  • 2026年热门的螺旋压榨机/螺杆压榨机实力品牌厂家推荐 - 行业平台推荐
  • DNP投资Rapidus,支持下一代半导体量产体系建设