在软考的时候,我们总是认为算法是最难的一个部分,所以每次看到这个地方的时候都会自动略过,所以想要学好和攻破某个知识难点的时候,我们最要做的事情就是克服心理上的恐惧,把它当想象成一个很简单容易的事情,然后再去一步步瓦解困难,一切问题都Soeasy啦!
下面总结一下这其实不难的算法:
首先我们要确认,算法是一种解决问题的思想,它分为很多种形式去解决我们的问题。从算法结构上可以分为:递归式和非递归式。
分治
分治算法的思想就是大问题化小,分而治之,典型的有归并排序
归并排序分为三个步骤来进行:
(1)分解
(2)求解
(3)合并
下面根据代码进行分析:
void MergeSort(int A[],int p,int r){
//这里的P代表的是第一个元素,r代表的是最后一个元素,q代表的是中间元素。
int q;
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为后一段元素。
int n1=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++;
}
}
}
总结:
递归排序就是将大问题划分成一个个不可分解的小问题,然后进行逐个解决,就像给定一个序列,将它分解成
一个个不可再分的子序列,然后一个个进行对比,进行排序。就像我们学习的时候,不仅要有宏观的把控,同样要把
学习的任务细分到每一天,这样,我们就可以简化那些看似不可能达到的任务,每天完成起来也很轻松和简单!