走进算法

    算法被认为是计算机科学的基石,算法理论研究的是算法的设计技术和分析技术。前者回答的是“对待定的问题,如何提出一个算法来求解?”这样的问题,即如何设计一个有效的算法解决待定的问题;后者回答的是“该算法是否足够好?”,即对已设计的算法如何评价或判断其优劣,或者对求解同一个问题的多个算法如何进行比较和评价。二者是互相依存的,设计出的算法需要检验和评价,对算法的分析反过来又可以帮助改进算法的设计。

    经常采用的算法设计技术主要有分治法、动态规划法、贪心法、回溯法、分支界限法,概率算法和近似算法等。对于所有的算法,米老师认为所有的都是采用的分治思想,开始我不怎么认同,但是后来通过米老师讲解过后,发现天下算法是一家啊。

    今天咱们就从第一个分治来说起。分治就是分而治之的思想,一个大问题我们解决不了,那么我们可以将大问题分成小问题,之后再去求解。

    一般来说,分治算法在每一层递归上都有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.依次进行,直到比完一摞为止 。剩下的就都是有序的了。

   从上面我们也可以看出,算法没有我们想象的那么难,怕就怕在,我们还没去学,就自己把自己吓退了。

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值