算法导论之分治法

来源:互联网 发布:南京牛商网络靠谱么 编辑:程序博客网 时间:2024/06/01 09:17

分治法

许多有用的算法在结构上是递归的:为了解决一个给定的问题,算法一次或多次递归的调用其自身以解决紧密相关的若干子问题。

分治法在每层递归时都有三个步骤

  1. 分解
  2. 解决
  3. 合并 
归并排序算法完全遵循分治模式
分解:分解待排序的n个元素序列为各具n/2个元素的两个子序列
private static void Mergesort(int a[]) {if (a.length == 1) {return;}int Len = a.length / 2;int head[] = new int[Len];if (a.length % 2 != 0) {Len++;}int end[] = new int[Len];for (int i = 0; i < head.length; i++) {head[i] = a[i];}for (int i = 0; i < end.length; i++) {end[i] = a[head.length + i];}System.out.println("head:" + Arrays.toString(head));System.out.println("end:" + Arrays.toString(end));Mergesort(head);Mergesort(end);}
输出结果:

head:[1, 23, 4, 3, 4]

end:[3, 2, 46, 7, 5, 5]

head:[1, 23]

end:[4, 3, 4]

head:[1]

end:[23]

head:[4]

end:[3, 4]

head:[3]

end:[4]


head:[3, 2, 46]

end:[7, 5, 5]

head:[3]

end:[2, 46]

head:[2]

end:[46]

head:[7]

end:[5, 5]

head:[5]

end:[5]

现在完成了递归分解的步骤。

解决:

private static void Mergesort(int a[]) {if (a.length == 1) {return;}int Len = a.length / 2;int head[] = new int[Len];if (a.length % 2 != 0) {Len++;}int end[] = new int[Len];for (int i = 0; i < head.length; i++) {head[i] = a[i];}for (int i = 0; i < end.length; i++) {end[i] = a[head.length + i];}System.out.println("head:" + Arrays.toString(head));System.out.println("end:" + Arrays.toString(end));Mergesort(head);Mergesort(end);int j = 0;int k = 0;for (int i = 0; i < a.length; i++) {if (head[j] < end[k]) {a[i] = head[j];if (j < head.length - 1)j++;elsehead[j] = Integer.MAX_VALUE;} else {a[i] = end[k];if (k < end.length - 1)k++;elseend[k] = Integer.MAX_VALUE;}}System.out.println("a" + Arrays.toString(a));}
结果:

head:[1, 23, 4, 3, 4]

end:[3, 2, 46, 7, 5, 5]

head:[1, 23]

end:[4, 3, 4]

head:[1]

end:[23]

a[1, 23]

head:[4]

end:[3, 4]

head:[3]

end:[4]

a[3, 4]

a[3, 4, 4]

a[1, 3, 4, 4, 23]

head:[3, 2, 46]

end:[7, 5, 5]

head:[3]

end:[2, 46]

head:[2]

end:[46]

a[2, 46]

a[2, 3, 46]

head:[7]

end:[5, 5]

head:[5]

end:[5]

a[5, 5]

a[5, 5, 7]

a[2, 3, 5, 5, 7, 46]

a[1, 2, 3, 3, 4, 4, 5, 5, 7, 23, 46]

注:如果是按大到小来排的的话。记得把integer.Max_value变成min_value;
合并:
其实在解决的时候就已经进行了合并了:)






0 0
原创粉丝点击