分治法概述
1、分治法的设计思想
对于一个规模为 n 的问题,当n的值很小时,问题可以被很容易的解决,则可以将这类问题进行分解,分解为 k 个较小的子问题,这些问题相互独立且与原问题的形式相同,递归地解决这些子问题,并将各个子问题的解合并得到原问题的解,这种算法程序设立叫分治法。
分治法所能解决的问题一般包括一下几个特征
1、该问题的规模缩小到一定程度就可以容易额解决
2、该问题可以分解为若干个规模较小的相似问题
3、利用该问题分解出的子问题的解可以合并为该问题的解
4、该问题所分解出的子问题是相互独立的,即子问题之间不包含公共子问题。
2、分治法的求解过程
1、分解成若干个子问题
2、求解子问题
3、合并子问题
分治法实现的归并排序
这里用的是递归的方法,如果对递归的概念不懂的话,这里有一篇讲解递归的博客
算法与程序设计之递归程序设计
分析:
给定一个无序的数组
(12 3 45 21 9) 从中间开始将数组分割,
分割成每个小数组只有一个元素,单个元素一定是有序的,再从下往上进行合并,即先自上而下的分析,自下而上的求解,这种算法的思想与动态规划的思想有些不同。
合并的过程
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
//合并两个子数组
void Merge(int *arr,int low,int mid,int high)
{
assert(arr != NULL);
//新申请一个内存用来存储合并后的数组
int *tmp = (int *)malloc(sizeof(int