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;
}
相关推荐
君义_noip13 分钟前
信息学奥赛一本通 1952:【10NOIP普及组】三国游戏 | 洛谷 P1199 [NOIP 2010 普及组] 三国游戏
c++·信息学奥赛·csp-s
努力也学不会java30 分钟前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
旖-旎1 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
ECT-OS-JiuHuaShan1 小时前
朱梁万有递归元定理,重构《易经》
算法·重构
顶点多余1 小时前
使用C/C++语言链接Mysql详解
数据库·c++·mysql
汉克老师1 小时前
GESP2026年3月认证C++四级( 第二部分判断题(1-10))
c++·指针·函数重载·文件操作·数组·gesp4级·gesp四级
智者知已应修善业2 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
khddvbe2 小时前
C++并发编程中的死锁避免
开发语言·c++·算法
C羊驼2 小时前
C语言:两天打鱼,三天晒网
c语言·经验分享·笔记·算法·青少年编程
菜菜小狗的学习笔记2 小时前
剑指Offer算法题(四)链表
数据结构·算法·链表