分治算法核心思想

分治算法用四个字概括就是分而治之。

将原问题划分成多个小规模并且简单的子问题,这些子问题的结构与原问题相似,因此,递归地解决这些子问题,将子问题的解合并就可以得到原问题的解了。

分治算法的思路与递归很相似,但是分治算法是一种算法思想,是一种处理问题的思想,而递归是一种编程技巧。所以,分治算法通常适合使用递归来实现。

在使用递归实现分治算法时,有以下三步操作:

  1. 分解:将子问题分解成一系列小规模并且与原问题结构相似的子问题
  2. 解决:递归的解决每一个子问题
  3. 合并:将子问题的解合并得到原问题的解

那么,哪些问题适合使用分治算法来解决呢?

  1. 原问题可以分解成一系列与原问题结构相似的子问题,并且子问题很容易解决
  2. 原问题分解成的子问题可以独立求解,并且子问题与子问题之间没有关联性(区别于动态规划)
  3. 原问题在分解子问题的时候存在终止条件,即分解到一定程度后,子问题很容易解决。
  4. 最后求得子问题的解后,可以合并成原问题的解,并且这个合并操作复杂度不能太高。

分治算法实践:归并排序

两路归并排序的思路是,首先将数组分为两半,再递归的进行分割,直到每一份都只剩 1 个数据,再将每一份两两合并。如图所示:

  1. 分解
  2. 解决
    可以发现,在分解到只有单个数据时,从排序的角度看,实际上已经有序的,因此,直接再合并即可
  3. 合并

    C代码实现:
#include<stdio.h>
#include<stdlib.h>
//一遍归并
void merge(int a[], int temp[], int start, int mid, int end) {int i = start, j = mid + 1, k = start; //第一部分:start到mid,第二部分:mid+1到endwhile(i != mid + 1 && j != end + 1) {if(a[i] > a[j]) {                   //取较大者导入临时数组temp[k++] = a[i++];} else {temp[k++] = a[j++];}}while(i != mid + 1) {                   //两个部分若有多余的,直接导入temp数组temp[k++] = a[i++];}while(j != end + 1) {temp[k++] = a[j++];}for(i = start; i <= end; i ++) {        //从临时数组导出到原数组a[i] = temp[i];}
}
void merge_sort(int a[], int temp[], int start, int end) {int mid;if(start < end) {mid = (start + end) / 2;merge_sort(a,temp,start,mid);     //前半部分递归merge_sort(a,temp,mid+1,end);     //后半部分递归merge(a,temp,start,mid,end);      //排序}
}
void Sort(int a[], int N) {int* b;b = (int*)malloc(N*sizeof(int));if(b != NULL) {merge_sort(a,b,0,N);free(b);} elseprintf("空间不足");
}
int main() {int a[10] = {0,1,2,3,4,5,6,7,8,9,};Sort(a,9);for(int i = 0 ; i < 10 ; i ++) {printf("%d ",a[i]);}
}

分治算法详解:分而治之相关推荐

  1. 分治算法详解(超详细)

    原 分治算法详解 分类专栏: 算法详解 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 原文链接: https://blog.csdn.net/effective_coder/a ...

  2. 分治算法 --- 详解

    ❤️❤️❤️感谢各位朋友接下来的阅读❤️❤️❤️ 分治算法概念: 分治算法,即分而治之: 在计算机科学中,分治法是一种很重要的算法.分治算法,字面上的解释是"分而治之",分治算法主 ...

  3. 分治算法详解(带图)

    实际场景中,我们之所以觉得有些问题很难解决,主要原因是该问题涉及到大量的数据,如果只需要处理少量的数据,问题会变得非常容易解决. 举一个简单的例子,设计一个排序算法实现对 1000 个整数进行排序.对 ...

  4. 五大常用算法——分治算法详解及经典例题

    一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子 ...

  5. 7大排序算法详解+java实现

    目录 0 概述 1 冒泡排序 2 选择排序 3 插入排序 4 希尔排序 5 快速排序 6 归并排序 7 基数排序 下载地址 7大排序算法详解文档及java代码实现(可直接运行)下载地址:https:/ ...

  6. 快速排序算法详解(原理,时间复杂度,实现代码)

    快速排序算法详解(原理.实现和时间复杂度) 快速排序是对冒泡排序的一种改进,由 C.A.R.Hoare(Charles Antony Richard Hoare,东尼·霍尔)在 1962 年提出. 快 ...

  7. 排序算法,最全的10大排序算法详解(Sort Algorithm)

    文章目录 排序算法,最全的10大排序算法详解(Sort Algorithm) 排序算法分类 排序算法稳定性 时间复杂度(time complexity) 1#时间复杂度的意义 2#基本操作执行次数 如 ...

  8. JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序)

    JS 排序算法详解(冒泡排序,选择排序,插入排序,希尔排序,快速排序) 一. 大O表示法 在进行排序算法之前,我们得先掌握一种对算法效率的表示方法,大O表示法. 我们使用大O表示法来表示算法的时间复杂 ...

  9. 【数据挖掘】:FP增长算法详解

    FP-growth算法,fpgrowth算法详解 使用FP-growth算法来高效发现频繁项集 前言 你用过搜索引擎挥发现这样一个功能:输入一个单词或者单词的一部分,搜索引擎酒会自动补全查询词项,用户 ...

最新文章

  1. 计算机维护系统Win8PE,u启动windows8PE工具箱
  2. (1)虚拟机管理——在微软云Azure新门户创建虚拟机
  3. Qt 数据库操作(二)
  4. sublime html 折叠,关于sublime text, notepad++,vscode 代码折叠显示的比较
  5. oracle数据库导入导出expdp/impdp命令详细操作过程
  6. 10个你应该了解的Git命令(以及Git省时小窍门)
  7. java多线程模拟loadrunner进行压测
  8. CSS3之2D与3D变换
  9. 2021年中国宠物食品加工设备市场趋势报告、技术动态创新及2027年市场预测
  10. python opencv保存图片_OpenCV Python 保存图片
  11. 如何卸载mysql server 2005_彻底的卸载SQL Server2005
  12. 非常实用的一键开关机电路
  13. 爱企查爬虫selenium
  14. java配置 path_java中path的配置
  15. verilog从txt中读取_将Verilog中的二进制文件数据读入2D数组
  16. 哈勃望远镜研究员测试区块链的空间数据处理
  17. python求线段长度_如何用python求线段长度
  18. vivo Z3i的usb调试模式在哪里,开启vivo Z3iusb调试模式的教程
  19. python实现多句话翻译多语种(调翻译接口)
  20. Android tips(十二)--Android开发中使用矢量图

热门文章

  1. Typora使用系统安装的字体
  2. 如果Teamviewer真的不能用了,替代品有哪些
  3. 免费远程办公软件亲测
  4. 液晶拼接显示屏怎样内嵌到墙里
  5. 前端——》JS检测非法字符
  6. input file读取文件
  7. 吉利集团发展史成本演化(一天的成果)
  8. Xilinx 7系列FPGA数据手册:概述--中文版
  9. rsync增量同步文件用法实践
  10. MySQL_复购回购率