算法中经常用到的除了排序算法之外,还有一类是用来求最优的算法。五大常用求最优的算法是:分治法,回溯法,贪心法,动态规划法,分支限界法。从求解思想,求解过程,算法实例的过程让大家复习一下几个算法。
一.分治法
1)求解思想
把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题。直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。各个击破,分而治之。
适用于:问题可分解为规模较小的相同问题,最重要的是问题分解可以合并。
2)求解过程
- 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;
- 解决:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题
- 合并:将各个子问题的解合并为原问题的解。
3)算法实例
归并排序是应用分治法的一个完美的例子,归并排序的基本例子是将元素分半,对子序列排序,在将排好的子序列进行合并。下面是C代码。
#include<stdlib.h>
typedef int RecType;//要排序元素类型
void Merge(RecType *R,int low,int m,int high)
{
//将两个有序的子文件R[low..m)和R[m+1..high]归并成一个有序的子文件R[low..high]
int i=low,j=m+1,p=0; //置初始值
RecType *R1; //R1是局部向量
R1=(RecType *)malloc((high-low+1)*sizeof(RecType));
if(!R1)
{
return; //申请空间失败
}
while(i<=m&&