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;
}
相关推荐
skywalker_116 分钟前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia7 分钟前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg32 分钟前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
_日拱一卒43 分钟前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾1 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio
unicrom_深圳市由你创科技1 小时前
做虚拟示波器这种实时波形显示的上位机,用什么语言?
c++·python·c#
SatVision炼金士1 小时前
合成孔径雷达干涉测量(InSAR)沉降监测算法体系
算法
wuweijianlove1 小时前
算法稳定性与数值误差传播研究的技术2
算法
无限进步_1 小时前
【C++】电话号码的字母组合:从有限处理到通用解法
开发语言·c++·ide·windows·git·github·visual studio
计算机安禾1 小时前
【数据结构与算法】第35篇:归并排序与基数排序
c语言·数据结构·vscode·算法·排序算法·哈希算法·visual studio