20251025 分治总结

分治算法核心

将复杂问题分解为多个相似子问题,通过递归求解子问题并合并结果获得原问题解。需满足问题可分解、子问题独立、解可合并三个基本条件。

汉诺塔实现

移动n个圆盘时:

  • 将n-1个盘从起始柱移到过渡柱
  • 移动最底层盘到目标柱
  • 将n-1个盘从过渡柱移到目标柱

时间复杂度为O(2^n),空间复杂度O(n)由递归栈深度决定。

归并排序

采用分治策略的稳定排序算法:

  • 递归划分数组至单个元素
  • 双指针合并有序子数组
  • 使用哨兵节点简化边界判断

时间复杂度稳定为O(nlogn),空间复杂度O(n)来自临时数组。实际应用中可通过以下方式优化:

  • 对小规模子数组切换至插入排序
  • 原地归并减少内存消耗
  • 非递归实现避免栈溢出
cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[100005],b[100005];
void msort(int L,int r){
	if(L==r)return;
	int mid=(L+r)/2;
	msort(L,mid);
	msort(mid+1,r);
	int l=L,k=mid+1,cs=0;
	while(l<=mid&&k<=r){
		if(a[l]<a[k]){
			b[++cs]=a[l++];
		}else{
			b[++cs]=a[k++];
		}
	}
	if(l<=mid){
		while(l<=mid){
			b[++cs]=a[l++];
		}
	}
	if(k<=r){
		while(k<=r){
			b[++cs]=a[k++];
		}
	}
	for(int i=L;i<=r;i++){
		a[i]=b[i-L+1];
	}
}
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	msort(1,n);
	for(int i=1;i<=n;i++){
		cout<<a[i]<<" ";
	}
	return 0;
}
相关推荐
GuWenyue9 小时前
传统Agent工具两大痛点!300行代码落地MCP跨语言工具,彻底解耦LLM与工具
前端·人工智能·算法
同勉共进10 小时前
记一例 vibe coding + gcc bug 导致的线程池死锁问题
c++·线程池·gcc·死锁·vibe coding
我叫洋洋10 小时前
C ++ [ hello world ]
c语言·c++·算法
奋发向前wcx11 小时前
y1,y2总复习笔记5 2026.7.19
数据结构·笔记·算法
王维同学14 小时前
[自学][Windows C++]RunOnceEx 注册表分组键的安全遍历
c++·windows·安全·开源
战族狼魂15 小时前
高频面试题精选:分治与AI Agent架构
人工智能·算法·大模型·大语言模型
李剑一15 小时前
你用过网易的将军令嘛?它底层实现账号保护的原理相当简单粗暴
算法
Scott9999HH15 小时前
告别流量波动玄学!从法拉第电磁定律到底层 C/C++ 流量累积算法,深度解密工业级电磁流量计选型与开发
c语言·c++·算法
中达瑞和-高光谱·多光谱15 小时前
1nm到8nm光谱分辨率,你的应用该选哪款光谱相机?
算法·高光谱·高光谱相机
脱胎换骨-军哥15 小时前
C++/Rust无缝互操作:混合系统新常态
开发语言·c++·rust