归并算法--MergeSort
2016-03-28 21:36
369 查看
三国有云:天下大势分久必合,合久必分。
归并算法就充分表象了这一点,归并算法的基本思想就先将大数组分成小数组,再将小数组分成可以比较大小的两元数组,之后就是合的过程;合的过程中是要对元素进行排序的,两个较小的数组各元素比较后重新排序,再添加到大的数组上,直到合并完成。还是有图好分析问题:
百度了一下归并算法,里面只描述归并算法的下半部分,其实分的过程也挺重要,如果不分到最底层,就合得到的结果就不会相同,而且都不知道怎么比较了,之前我没看懂就是在这一点上没有分析到位。如何才能分到最底层,这就需要递归调用了,直到满足条件才开始合的过程。
代码实现:
归并算法就充分表象了这一点,归并算法的基本思想就先将大数组分成小数组,再将小数组分成可以比较大小的两元数组,之后就是合的过程;合的过程中是要对元素进行排序的,两个较小的数组各元素比较后重新排序,再添加到大的数组上,直到合并完成。还是有图好分析问题:
百度了一下归并算法,里面只描述归并算法的下半部分,其实分的过程也挺重要,如果不分到最底层,就合得到的结果就不会相同,而且都不知道怎么比较了,之前我没看懂就是在这一点上没有分析到位。如何才能分到最底层,这就需要递归调用了,直到满足条件才开始合的过程。
代码实现:
public class MergeSort implements Sort { public void sort(int[] data) { int[] temp = new int[data.length]; mergeSort(data, temp, 0, data.length - 1); display(data); } private void mergeSort(int[] data, int[] temp, int l, int r) { int mid = (l + r) / 2; if (l == r) //递归到最底层 return; mergeSort(data, temp, l, mid); //通过递归分治数组 mergeSort(data, temp, mid + 1, r);//通过递归分治数组 for (int i = l; i <= r; i++) { temp[i] = data[i]; } //先排序,后合并 int n = l; int m = mid + 1; for (int cur = l; cur <= r; cur++) { if (n == mid + 1) data[cur] = temp[m++]; else if (m > r) data[cur] = temp[n++]; else if (temp < temp[m]) data[cur] = temp[n++]; else data[cur] = temp[m++]; } } public void display(int[] data) { for (int i = 0; i < data.length; i++) { System.out.print(data[i] + "-----"); } } public static void main(String[] args) { MergeSort sort = new MergeSort(); int[] array = { 6,202,100,301,38,8,1 }; sort.sort(array); } }
相关文章推荐
- hdu 5651 (组合数学 + 阶乘求逆元)
- JDK判断对象死亡用过的和正在用的两种算法
- WebService学习之旅(六)使用Apache Axis2实现WebService客户端调用
- ASP.NET MVC 表单提交List到Controller
- 1到a是倒数和。
- BZOJ3097Hash Killer I
- 2016年蓝桥杯java B组省赛总结及注意1
- 数据结构,链表基本操作
- Java和JVM运行原理
- java-堆排序
- HDOJ 1116-Play on Words【欧拉路径+欧拉回路+并查集】
- HDU-5652 India and China Origins(并查集)
- 判断三角形与圆是否相交
- C++作业1
- UVA 10340 - All in All
- 《Linux内核分析》 第六节 进程的描述和进程的创建
- HTML5 Web SQL Database 数据库的使用方法【图文说明】
- 个人所得税计算器
- ubuntu下重装WIN7
- eclipse创建android项目,无法正常预览布局文件