数据结构与算法分析(Java语言描述)(5)—— 归并排序
来源:互联网 发布:淘宝e客服怎么设置 编辑:程序博客网 时间:2024/06/05 20:44
伪代码
split each element into partitions of size 1recursively merge adjancent partitions for i = leftPartStartIndex to rightPartLastIndex inclusive if leftPartHeadValue <= rightPartHeadValue copy leftPartHeadValue else: copy rightPartHeadValuecopy elements back to original array
MergeSort.java
package com.algorithm.sort;import java.util.Arrays;public class MergeSort{ // 我们的算法类不允许产生任何实例 private MergeSort(){} // 将arr[l...mid]和arr[mid+1...r]两部分进行归并 private static void merge(Integer[] arr, int l, int mid, int r) { Integer[] aux = Arrays.copyOfRange(arr, l, r+1); // 初始化,i指向左半部分的起始索引位置l;j指向右半部分起始索引位置mid+1 int i = l, j = mid+1; for( int k = l ; k <= r; k ++ ){ if( i > mid ){ // 如果左半部分元素已经全部处理完毕 arr[k] = aux[j-l]; j ++; } else if( j > r ){ // 如果右半部分元素已经全部处理完毕 arr[k] = aux[i-l]; i ++; } else if( aux[i-l].compareTo(aux[j-l]) < 0 ){ // 左半部分所指元素 < 右半部分所指元素 arr[k] = aux[i-l]; i ++; } else{ // 左半部分所指元素 >= 右半部分所指元素 arr[k] = aux[j-l]; j ++; } } } // 递归使用归并排序,对arr[l...r]的范围进行排序 private static void sort(Integer[] arr, int l, int r) {// if (l >= r)// return; // 优化2: 对于小规模数组, 使用插入排序 if (r - l < 15){ InsertionSort.sort(arr); return; } int mid = (l+r)/2; sort(arr, l, mid); sort(arr, mid + 1, r); // 优化1: 对于arr[mid] <= arr[mid+1]的情况,不进行merge // 对于近乎有序的数组非常有效,但是对于一般情况,有一定的性能损失 if (arr[mid] > arr[mid+1]) { merge(arr, l, mid, r); } } public static void sort(Integer[] arr){ int n = arr.length; sort(arr, 0, n-1); } // 测试MergeSort public static void main(String[] args) { int N = 8; Integer[] arr = SortTestHelper.generateRandomArray(N, 0, 100000); System.out.println("排序前的数组为:"); SortTestHelper.printArray(arr); Long start = System.currentTimeMillis(); MergeSort.sort(arr); Long end = System.currentTimeMillis(); System.out.println("-------------------------------------------"); System.out.println("排序后的数组为:"); SortTestHelper.printArray(arr); System.out.println("-------------------------------------------"); System.out.println("排序后的数组是否有序:"); if (SortTestHelper.isSorted(arr)){ System.out.println("数组有序~"); } else { System.out.println("数组无序!"); } System.out.println("-------------------------------------------"); System.out.println( "排序算法的运行时间为"+ " : " + (end-start) + "ms" ); }}
阅读全文
0 0
- 数据结构与算法分析(Java语言描述)(5)—— 归并排序
- 数据结构与算法分析(Java语言描述)(6)—— 归并排序(自底向上)
- (数据结构与算法分析 八)------插入排序,希尔排序,归并排序的实现( Java语言描述)
- 数据结构与算法分析(Java语言描述)(8)—— (随机)快速排序
- 数据结构与算法分析(Java语言描述)(9)—— (双轴)快速排序
- 数据结构与算法分析(Java语言描述)(1)—— 选择排序
- 数据结构与算法分析(Java语言描述)(2)—— 插入排序
- 数据结构与算法分析(Java语言描述)(3)—— 冒泡排序
- 数据结构与算法分析(Java语言描述)(4)—— 希尔排序
- 数据结构与算法分析(Java语言描述)(7)—— 快速排序
- 数据结构与算法分析(Java语言描述)(13)—— 原地堆排序
- 《数据结构与算法分析(c描述)》—— 归并排序
- 数据结构与算法分析(Java语言描述)(12)—— 堆排序与数组建堆
- 数据结构与算法分析(Java语言描述)(10)—— (三向切分)快速排序
- 读书笔记:数据结构与算法分析(Java语言描述)——数据结构概论
- 数据结构与算法(10)---Java语言实现:归并排序
- 数据结构与算法分析——Java语言描述
- 《数据结构与算法分析—Java语言描述》pdf
- 用css属性
- face_recogniton+python2 安装步骤,一切妥妥的
- 基于opencv3的手写板
- 关于java编程的三层架构
- springMVC整合Junit4进行单元测试-2
- 数据结构与算法分析(Java语言描述)(5)—— 归并排序
- Java数据结构与算法(3) 寻找中序遍历时的下一个结点
- 网站性能优化和关键渲染路径
- vim 保存文件“readonly option is set”的解决方法
- [开发规范] Git分支使用规范
- Exploratory Testing(探索测试)
- MATLAB中:冒号用法
- RdioGroup 里面点击事件
- 实现html页面及css3动画