分治法的递归实现

发布时间:2026/9/24 7:49:53
分治法的递归实现 分治法的递归实现一. 分治思想分治法核心分、治、合分将大问题拆分为多个结构相同的子问题治递归求解子问题子问题足够小时直接返回递归出口合合并子问题的解得到原问题结果二. C通用模板cpp// l、r代表区间左右边界int divide(int l, int r){// 递归出口if (l r)return 基础解;// 分int mid (l r) / 2;int leftRes divide(l, mid);int rightRes divide(mid 1, r);// 合return merge(leftRes, rightRes);}三. 示例归并排序经典分治C代码cpp#include#includeusing namespace std// 合并两个有序区间void merge(vector arr, int l, int mid, int r){vector tmp(r - l 1);int i l, j mid 1, k 0;while (i mid j r){if (arr[i] arr[j])tmp[k] arr[i];elsetmp[k] arr[j];}while (i mid) tmp[k] arr[i];while (j r) tmp[k] arr[j];// 写回原数组for (int p 0; p tmp.size(); p)arr[l p] tmp[p];}// 分治递归void mergeSort(vector arr, int l, int r){if (l r) return; // 递归终止int mid (l r) / 2;mergeSort(arr, l, mid); // 处理左半区间mergeSort(arr, mid1, r); // 处理右半区间merge(arr, l, mid, r); // 合并结果}int main(){vector arr {5,2,9,1,6};mergeSort(arr, 0, arr.size()-1);for (int num : arr)cout num ;return 0;}复杂度\boldsymbol{O(n\log n)}四. 适用场景 易错点适用归并排序、快速排序、数组求最值、统计逆序对等。易错缺少递归出口栈溢出区间划分错误元素重复或漏掉忘记合并子问题结果小结分治递归自顶向下拆分自底向上合并。把复杂大问题拆解成简单小问题求解是分治最巧妙的地方。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询