排序算法之归并排序
来源:互联网 发布:深圳网络出租屋办理 编辑:程序博客网 时间:2024/06/06 20:43
基本思想:分治策略
- 分解问题
- 解决问题
- 合并结果
public class MergeSort implements Sort{ //排序入口 @Override public void sort(int[] unsorted) { sort(unsorted,0,unsorted.length-1); } private void sort(int[] unsorted,int l,int r){ if (l < r){ //将待排数组划分成左右两个子数组 int m = (r+l)/2; //处理左边子数组 sort(unsorted,l,m); //处理右边子数组 sort(unsorted,m+1,r); //至此,两个子数组已经是有序的,接着就是合并 merge(unsorted,l,m,r); } } /*** * 辅助方法:合并两个有序数组 * [Al,Al+1,...Am] [Am+1,Am+2,...Ar] * @param array 包含两个已排序数组 * @param l 左子数组的左边界 * @param m 左子数组的右边界 * @param r 右子数组的右边界 */ private void merge(int[] array,int l,int m,int r){ int[] temp = new int[r-l+1]; int i = l,j=m+1,k=0; //两数组车轮战,依次比较 while (i<=m && j<=r){ if (array[i]<=array[j]) { temp[k++] = array[i++]; }else { temp[k++] = array[j++]; } } //一组已经全部排完,另一组还剩下部分数据,则无需比较直接按顺序紧接着临时数组后面 while(i <= m){ temp[k++] = array[i++]; } while(j <= r){ temp[k++] = array[j++]; } //将排好的数据拷贝回原数组 System.arraycopy(temp,0,array,l,temp.length); }}
- NOTE
这里使用的是递归方法,好处是实现简单,但我们知道递归方法会保存函数调用栈帧,当栈深度超过限制会抛出StackOverflowError错误。因此要注意排序的数据量,或增大栈空间。除此之外,还可以改进算法,将递归转换成循环。
阅读全文
0 0
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- 排序算法之归并排序
- zookeeper基础(转)
- LightOJ 1288 Subsets Forming Perfect Squares(高斯消元法)
- OSG-HUD
- xilinx IP核配置,一步一步验证Xilinx Serdes GTX最高8.0Gbps
- B+树在数据库中的应用
- 排序算法之归并排序
- 【帝国CMS】灵动标签调用TAG的方法
- [LintCode]384.最长无重复字符的子串
- OSG-阴影
- 多线程之简单定时器的实现代码
- POJ1149-PIGS
- Android开发之JSON全解析
- Vue笔记(一)
- 逐行读取文件内容的三种方法