排序算法之归并排序Java版
2015-07-01 22:24
344 查看
/** * 归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法将已有序的子序列合并,最后得到完全有序的序列。 * 归并排序是稳定排序,速度仅次于快速排序 * 时间复杂度为O(nlogn) * 空间复杂度为O(n) 归并排序需要n空间的临时数组来存储子序列 * 归并排序原理: * 将待排序序列分为若干个子序列,,对每个子序列进行排序。 * 然后再把相邻的两个有序子序列合并,并排序成为新的有序子序列。 * 依次类推,最终把所有子序列合并成一个有序序列。 * */ public class MergeSort { public void sort(int[] arr){ sort(arr, 0, arr.length - 1); } private void sort(int[] arr, int start, int end){ if(start >= end){ return; } int middle = (start + end) / 2; sort(arr, start, middle); sort(arr, middle + 1, end); merge(arr, start, middle, end); } /** * 有序的相邻子序列合并 * @param arr 数组 * @param start 左边序列开始索引 * @param middle 左边序列结束索引,middle+1是右边序列开始索引 * @param end 右边序列结束索引 */ private void merge(int[] arr, int start, int middle, int end){ //临时数组长度 int tmplen = end - start + 1; //临时数组 int[] tmp = new int[tmplen]; //左边数组的索引 int left = start; //右边数组的索引 int right = middle + 1; //tmp数组的索引 int i = 0; while(left <= middle && right <= end){ if(arr[left] < arr[right]){ tmp[i] = arr[left]; left++; }else{ tmp[i] = arr[right]; right++; } i++; } while(left <= middle){ tmp[i] = arr[left]; left++; i++; } while(right <= end){ tmp[i] = arr[right]; right++; i++; } for(i = 0; i < tmplen; i++){ arr[start + i] = tmp[i]; } } }
相关文章推荐
- 排序算法之快速排序Java版
- Java每日编程day2
- Java基础之简单内存管理
- 使用java的Calendar对象获得当前日期的上几个度开始、结束时间
- 排序算法之冒泡排序Java版
- Java面向对象之类
- 2015070102 - EffactiveJava笔记 - 第47条 了解和使用类库(1)
- java打包
- JAVA集合之——Comparable和Comparator
- MyBatis数据持久化(十)与Spring4整合
- MyBatis数据持久化(十)与Spring4整合
- SpringMVC+Spring+Mybatis整合
- MyBatis数据持久化(十)与Spring4整合
- myEclipse6.5注册码生成
- 排序算法之堆排序Java版
- Maven搭建SpringMVC+Hibernate项目详解
- 《Java课程实习》日志(周二)
- 在ubuntu下用apt-get安装和管理java
- 排序算法之直接选择排序Java版
- Java 并发包之线程池和原子计数