标签:
算法被认为是计算机科学的基石,算法理论研究的是算法的设计技术和分析技术。前者回答的是“对待定的问题,如何提出一个算法来求解?”这样的问题,即如何设计一个有效的算法解决待定的问题;后者回答的是“该算法是否足够好?”,即对已设计的算法如何评价或判断其优劣,或者对求解同一个问题的多个算法如何进行比较和评价。二者是互相依存的,设计出的算法需要检验和评价,对算法的分析反过来又可以帮助改进算法的设计。
经常采用的算法设计技术主要有分治法、动态规划法、贪心法、回溯法、分支界限法,概率算法和近似算法等。对于所有的算法,米老师认为所有的都是采用的分治思想,开始我不怎么认同,但是后来通过米老师讲解过后,发现天下算法是一家啊。
今天咱们就从第一个分治来说起。分治就是分而治之的思想,一个大问题我们解决不了,那么我们可以将大问题分成小问题,之后再去求解。
一般来说,分治算法在每一层递归上都有3个步骤。
1.分解。将原问题分解成一系列问题。
2.求解。递归地求解哥子问题。若子问题足够小,则直接求解。
3.合并。将子问题的解合并成原问题的解。
归并算法是成功应用分治法的一个完美的例子,咱们今天来细细看看他是怎么分治的。
(1)分解。将n个元素分成各含n/2个元素的子序列。
(2)求解。用归并排序对两个子序列递归地排序。
(3)合并。合并两个已经排好的子序列以得到排序结果。
<span style="font-family:KaiTi_GB2312;font-size:18px;">Void MergeSort(int A[],int p,int r){ Int q; If(p<r){ 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){ 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[i];){ A[K]=L[i]; } Else{ A[k]=R[j]; j++; } } } </span>
1.都拿出第一张来比较,大的拿走,小的留下不动。
2.继续拿出第一次较小的和另一边第二张比较。大的拿走。
3.依次进行,直到比完一摞为止 。剩下的就都是有序的了。
从上面我们也可以看出,算法没有我们想象的那么难,怕就怕在,我们还没去学,就自己把自己吓退了。
标签:
原文地址:http://blog.csdn.net/gaibian0823/article/details/46277621