1.分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。
分治法解题的一般步骤:
(1)分解,将要解决的问题划分成若干规模较小的同类问题;
(2)求解,当子问题划分得足够小时,用较简单的方法解决;
(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。
分治法解题的一般步骤:
(1)分解,将要解决的问题划分成若干规模较小的同类问题;
(2)求解,当子问题划分得足够小时,用较简单的方法解决;
(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。
package algorithms;
public class DivideAndConquer {
public static void main(String args[]) {
int[] num = {23, 27, 56 , 78, 99, 4, 24, 38, 55, 80};
System.out.println("未排序前:");
for (int a: num)
System.out.print(a + " ");
System.out.println();
mergesort(num, 0, 9); // merge(数组名,第一个数组第一个元素角标,第一个数组最后一个元素角标,第二个数组最后一个元素角标)
System.out.println("未排序前:");
for (int a: num)
System.out.print(a + " ");
System.out.println();
}
public static void merge(int[] A, int p, int q, int r) {
int n1 = q - p + 1;
int n2 = r - q;
int []L = new int[n1];
int []R = new int[n2];
int i = 0;
int j = 0;
while (i != n1) {
L[i] = A[p + i];
++i;
}
while (j != n2) {
R[j] = A[q + j + 1];
++j;
}
i = j = 0;
int k = p;
while (i != n1 && j != n2) {
if (L[i] <= R[j]) {
A[k] = L[i];
++i;
}
else {
A[k] = R[j];
++j;
}
++k;
}
if (i == n1)
while (j != n2) {
A[k] = R[j];
++k;
++j;
}
if (j == n2)
while (i != n1) {
A[k] = L[i];
++k;
++i;
}
}
public static void mergesort(int[] A, int p, int r) {
if (p < r) {
int q = (int)((p + r) / 2);
mergesort(A, p, q);
mergesort(A, q+1, r);
merge(A, p, q, r);
}
}
}