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;
}
相关推荐
tudousisi22221 分钟前
P1216 [IOI 1994 / USACO1.5] 数字三角形 题解复盘
c++
cpp_25011 小时前
P1113 [USACO02FEB] 杂务
数据结构·c++·算法·动态规划·图论·拓扑排序·洛谷题解
月光船幽幽1 小时前
门控函数SHS阈值与调制机制解析
人工智能·python·算法
此生决int1 小时前
深入理解C++系列(11)——stack、queue和priority_queue
开发语言·c++
Doraemomo1 小时前
数据结构-哈希表
数据结构·算法·散列表
君君思密达1 小时前
Leetcode Hot 100 题目详解-哈希表
数据结构·算法·leetcode
lucas_AI1 小时前
Muse Glimmer 30B:Meta 难得给的真开源,强在哪、虚在哪
人工智能·算法
ai产品老杨1 小时前
国产NPU视觉算法完整流程
算法
过期的秋刀鱼!1 小时前
带替换的采样
人工智能·python·算法·决策树·机器学习
过期的秋刀鱼!2 小时前
使用多个决策树
人工智能·算法·决策树·机器学习·数据挖掘