20251025 分治总结
分治算法核心
将复杂问题分解为多个相似子问题,通过递归求解子问题并合并结果获得原问题解。需满足问题可分解、子问题独立、解可合并三个基本条件。
汉诺塔实现
移动n个圆盘时:
- 将n-1个盘从起始柱移到过渡柱
- 移动最底层盘到目标柱
- 将n-1个盘从过渡柱移到目标柱
时间复杂度为O(2^n),空间复杂度O(n)由递归栈深度决定。
归并排序
采用分治策略的稳定排序算法:
- 递归划分数组至单个元素
- 双指针合并有序子数组
- 使用哨兵节点简化边界判断
时间复杂度稳定为O(nlogn),空间复杂度O(n)来自临时数组。实际应用中可通过以下方式优化:
- 对小规模子数组切换至插入排序
- 原地归并减少内存消耗
- 非递归实现避免栈溢出
#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;
}
