归并算法--MergeSort
来源:互联网 发布:小燕子变真格格知画 编辑:程序博客网 时间:2024/05/21 09:46
三国有云:天下大势分久必合,合久必分。
归并算法就充分表象了这一点,归并算法的基本思想就先将大数组分成小数组,再将小数组分成可以比较大小的两元数组,之后就是合的过程;合的过程中是要对元素进行排序的,两个较小的数组各元素比较后重新排序,再添加到大的数组上,直到合并完成。还是有图好分析问题:
百度了一下归并算法,里面只描述归并算法的下半部分,其实分的过程也挺重要,如果不分到最底层,就合得到的结果就不会相同,而且都不知道怎么比较了,之前我没看懂就是在这一点上没有分析到位。如何才能分到最底层,这就需要递归调用了,直到满足条件才开始合的过程。
代码实现:
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[n] < 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); }}
0 0
- 归并排序算法 MergeSort
- 归并算法--MergeSort
- 归并算法-MergeSort
- 归并排序算法MergeSort in C#
- 算法-排序-归并排序(MergeSort)分析
- MergeSort(归并排序)算法Java实现
- Java实现算法归并排序(MergeSort)
- Java 归并排序(MergeSort)算法实现
- 归并排序(mergeSort)之非递归算法
- 排序算法 之 归并排序 MergeSort
- Java排序算法--归并排序(MergeSort)
- 排序算法--归并排序(MergeSort)
- linux下归并排序(MergeSort)算法的C语言实现
- 【算法导论学习-002】归并排序(MergeSort)
- 算法导论一——关于MergeSort(归并排序)总结
- mergesort 归并排序
- mergesort归并排序
- MergeSort归并排序
- C++ primer 读书笔记--第三章 标准库类型
- 如何用CORS来解决JS中跨域的问题
- ooVoo(视频通讯)
- OC中的Values——and——Collections
- java 堆排序
- 归并算法--MergeSort
- JDK判断对象死亡用过的和正在用的两种算法
- 【bzoj2006】[NOI2010]超级钢琴 堆+st表
- MySQL 使用序列化表的方法实现行转列
- 斯坦福大学深度学习与自然语言处理第一讲:引言
- 1到a的奇数的和
- tomcat 的 SSL 配置
- 斯坦福大学深度学习与自然语言处理第二讲:词向量
- 多重背包二进制