您的位置:首页 > 其它

软考-分治算法

2015-10-27 16:01 204 查看
      在软考的时候,我们总是认为算法是最难的一个部分,所以每次看到这个地方的时候都会自动略过,所以想

要学好和攻破某个知识难点的时候,我们最要做的事情就是克服心理上的恐惧,把它当想象成一个很简单容易的事

情,然后再去一步步瓦解困难,一切问题都Soeasy啦!

 

     下面总结一下这其实不难的算法:

     首先我们要确认,算法是一种解决问题的思想,它分为很多种形式去解决我们的问题。从算法结构上可以分为

递归式和非递归式。
 
分治

     分治算法的思想就是大问题化小,分而治之,典型的有归并排序

     归并排序分为三个步骤来进行:

       (1)分解

       (2)求解

       (3)合并

下面根据代码进行分析:

void MergeSort(int A[],int p,intr){
//这里的P代表的是第一个元素,r代表的是最后一个元素,q代表的是中间元素。
intq;
if(p<r){
//分解,将元素分解为n/2个子序列
q=(p+r)/2;
//进行存储,分别存储子序列的前一半,后一半,和整体
MergeSort(A,p,q);
MergeSort(A,q+1,r);
Merge(A,p,q,r);

}

}
//定义一个递归,里面存储所需要的变量
void Merge(int A[],int p,int q,int r){
//定义变量,n1为前一段元素,n2为后一段元素。
intn1=q-p+1,n2=r-q,i,j,k;
int L[50],R[50];
//将前一段元素进行赋值,找到最大的那个元素,分别放置到数组中。
for(i=0;i<n1;i++)
L[i]=A[p+i];
for(j=0;j<n2;j++)
R[j]=A[q+j+1];
L[n1]=INT_MAX;
R[n2]=INT_MAX;
i=0;
j=0;
//分别对子序列排序
for(k=p;k<r=1;k++){
if(L[i]<R[j]){
A[k]=L[i];
i++;
}
else{
A[k]=R[j];
j++;
}
}
}


总结:

    递归排序就是将大问题划分成一个个不可分解的小问题,然后进行逐个解决,就像给定一个序列,将它分解成

一个个不可再分的子序列,然后一个个进行对比,进行排序。就像我们学习的时候,不仅要有宏观的把控,同样要把

学习的任务细分到每一天,这样,我们就可以简化那些看似不可能达到的任务,每天完成起来也很轻松和简单!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  分治算法 软考