算法导论之分治法
来源:互联网 发布:南京牛商网络靠谱么 编辑:程序博客网 时间:2024/06/01 09:17
分治法
许多有用的算法在结构上是递归的:为了解决一个给定的问题,算法一次或多次递归的调用其自身以解决紧密相关的若干子问题。
分治法在每层递归时都有三个步骤
- 分解
- 解决
- 合并
归并排序算法完全遵循分治模式
分解:分解待排序的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
- 算法导论之分治法
- 算法导论之分治法
- 算法导论之分治法
- 算法导论学习之分治法
- 【算法导论】分治法
- 算法导论--分治法
- 算法导论笔记一:算法设计之分治法
- 算法导论:分治法(2)
- 算法导论--分治法--P17
- 算法导论第二版笔记之分治法
- 《算法导论》 2.3.1分治法
- 算法导论:分治法(1)
- [算法导论]分治法---最大子数组
- 分治法(算法导论Lec3)
- 【算法导论】03——分治法
- 【算法导论】分治法及归并排序
- 算法导论 第四章:分治法(二)
- 【算法导论】分治策略
- MongoDB的数据库连接(命令行方式)
- AFNetworking 报错 Request failed: unacceptable content-type: text/html
- C++之父:C++ 的五个普遍误解(1)
- Cocos2d-x NO_BORDER适配
- Java基础--反射
- 算法导论之分治法
- C++ 的五个普遍误解(2):垃圾回收
- 关于ArrayList 的基础知识的小程序
- iOS开发Tips
- JformattedTextField之MaskFormatter
- Currency Exchange
- python基础修行(4)
- iOS开发UIDevice查看系统信息,从一个问题开始如何快速找到自己想要的属性和方法并看懂它
- 为什么选择Qt呢?