分治算法核心
将复杂问题分解为多个相似子问题,通过递归求解子问题并合并结果获得原问题解。需满足问题可分解、子问题独立、解可合并三个基本条件。
汉诺塔实现
移动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;
}