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;
}
相关推荐
姜鱼问生17 分钟前
fail2ban 实战:从默认配置到生产可用
后端·算法·架构
垆边人似月.23 分钟前
华为题:全排列
算法·深度优先·图论
杜 硕31 分钟前
快速排序详解01
数据结构·算法·排序算法
Matlab程序猿1 小时前
【MATLAB源码-第459期】基于matlab的D-H模型与阻尼最小二乘逆运动学的六自由度机械臂五次轨迹规划及动力学前馈PD控制仿真。
人工智能·算法·matlab·d-h建模·六自由度串联机械臂
信奥卷王1 小时前
[GESP202606 六级] 满二叉树
数据结构·算法
积流成海1 小时前
用代码实现哈希计算器:Web Crypto API 实战
前端·算法·哈希算法·哈希函数·盘子工具站
WL学习笔记1 小时前
类和对象(下)
c++·类和对象
Nil2081 小时前
leetcode 300最长递增子序列
算法·leetcode·职场和发展
傲世仙尊2 小时前
拷贝构造-传值传参的连锁反应与隐式函数的三个局限
c++
垆边人似月.2 小时前
华为机试题 :最大数
c++·算法·华为