分而治之(又称D&C)
书中举了一个例子,假设你是农场主,有一块土地,如图所示:
你要将这块地均匀分成方块,且分出的方块要尽可能大。
从图上看,显然是不符合预期结果的。
那么如何将一块地均匀分成方块,并确保分出的方块是最大的呢?使用D&C策略。
(1)D&C算法是递归的;
(2)使用D&C解决问题的过程包括两个步骤:
a.找出基线条件,这种条件必须尽可能简单;
b.不断将问题分解(或者说缩小规模),直到符合基线条件;
就如何保证分出的方块是最大的呢?《算法图解》中的快速排序一章提到了欧几里得算法。
什么是欧几里得算法?
欧几里得算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数。
应用领域有数学和计算机两个方面。
举个代码例子说一下欧几里得算法:
package cn.pratice.simple;public classEuclid {public static voidmain(String[] args) {int m = 63;int n = 18;int remainer = 0;while(n!=0) {
remainer= m %n;
m=n;
n=remainer;
}
System.out.println(m);
}
}
最终的结果是9,正好63和18的最大公因数也是9.
其中也体现着分而治之的思想。记住,分而治之并非可用于解决问题的算法而是一种解决问题的思路。
再举个例子说明,如图所示:
需要将这些数字相加,并返回结果,使用循环很容易完成这种任务,以Java为例:
package cn.pratice.simple;public classEuclid {public static voidmain(String[] args) {int []num = new int[] {2,4,6};int total = 0;for (int i = 0; i < num.length; i++) {
total+=num[i];
}
System.out.println(total);
}
}
快速排序
快速排序是一种常用的排序算法,比选择排序快的多。
代码示例如下(快速排序):
package cn.pratice.simple;public classQuickSort {//声明静态的 getMiddle() 方法,该方法需要返回一个 int 类型的参数值,在该方法中传入 3 个参数
public static int getMiddle(int[] list,int low,inthigh) {int tmp = li