算法-分治

来源:互联网 发布:淘宝刷胶机器 编辑:程序博客网 时间:2024/05/17 06:10

在软考的时候,我们总是认为算法是最难的一个部分,所以每次看到这个地方的时候都会自动略过,所以想要学好和攻破某个知识难点的时候,我们最要做的事情就是克服心理上的恐惧,把它当想象成一个很简单容易的事情,然后再去一步步瓦解困难,一切问题都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++;        }    }   }

总结:
递归排序就是将大问题划分成一个个不可分解的小问题,然后进行逐个解决,就像给定一个序列,将它分解成
一个个不可再分的子序列,然后一个个进行对比,进行排序。就像我们学习的时候,不仅要有宏观的把控,同样要把
学习的任务细分到每一天,这样,我们就可以简化那些看似不可能达到的任务,每天完成起来也很轻松和简单!

0 0
原创粉丝点击