实现代码:MergeSort.java

public class MergeSort {

public int[] sort(int[] input) {

if (input.length <= 1) return input;

if (input.length == 2) {

if (input[0] > input[1]) {

int temp = input[0];

input[0] = input[1];

input[1] = temp;

}

return input;

}

int mid = input.length / 2;

int[] firstHalf = sort(getPart(input, 0, mid));

int[] secondHalf = sort(getPart(input, mid + 1, input.length - 1));

return mergePart(firstHalf, secondHalf);

}

private int[] mergePart(int[] firstHalf, int[] secondHalf) {

int[] result = new int[firstHalf.length + secondHalf.length];

int firstIndex = 0, secondIndex = 0, resultIndex = 0;

while (resultIndex < result.length) {

if (chooseFirstHalf(firstHalf, firstIndex, secondHalf, secondIndex))

result[resultIndex++] = firstHalf[firstIndex++];

else

result[resultIndex++] = secondHalf[secondIndex++];

}

return result;

}

private boolean chooseFirstHalf(int[] firstHalf, int firstIndex, int[] secondHalf, int secondIndex) {

if (firstIndex == firstHalf.length) return false;

if (secondIndex == secondHalf.length) return true;

return firstHalf[firstIndex] < secondHalf[secondIndex];

}

private int[] getPart(int[] input, int begin, int end) {

int[] result = new int[end - begin + 1];

for (int i = begin; i <= end; i++) result[i - begin] = input[i];

return result;

}

}

测试代码:MergeSortTest.java

import org.junit.*;

import static org.junit.Assert.*;

public class MergeSortTest {

MergeSort mergeSort;

@Before

public void setUp() {

mergeSort = new MergeSort();

}

@Test

public void should_return_1_for_merge_sort_1() {

int[] input = {1};

int[] expected = {1};

assertArrayEquals(expected, mergeSort.sort(input));

}

@Test

public void should_return_12_for_merge_sort_21() {

int[] input = {2,1};

int[] expected = {1,2};

assertArrayEquals(expected, mergeSort.sort(input));

}

@Test

public void should_return_1234_for_merge_sort_3214() {

int[] input = {3,2,1,4};

int[] expected = {1,2,3,4};

assertArrayEquals(expected, mergeSort.sort(input));

}

@Test

public void should_return_12345_for_merge_sort_54321() {

int[] input = {5, 4, 3, 2, 1};

int[] expected = {1, 2, 3, 4, 5};

assertArrayEquals(expected, mergeSort.sort(input));

}

}

mergesort java 源码_MergeSort(Java)相关推荐

  1. Java源码解析——Java IO包

    一.基础知识: 1. Java IO一般包含两个部分:1)java.io包中阻塞型IO:2)java.nio包中的非阻塞型IO,通常称为New IO.这里只考虑到java.io包中堵塞型IO: 2. ...

  2. Java 源码赏析 - java.lang - Void

    被人鄙视了,于是也来读读源码... package java.lang;/*** The Void class is an uninstantiable placeholder class to ho ...

  3. 【JAVA源码分析——Java.lang】String源码分析

    String 基本实现 初学java经常会误认为String是java基本类型,实际上String并非Java基本类型,String本质上是对char数组的封装. 以下是String实现相关源码 /* ...

  4. java 源码学习,Java源码剖析34讲学习笔记~4

    详解 ThreadPoolExecutor 的参数含义及源码执行流程 前言 在阿里巴巴的开发者手册中针对线程池有如下说明: [强制]线程池不允许使用 Executors 去创建,而是通过 Thread ...

  5. Java源码:java.lang.reflect反射之AccessibleObject、ReflectionFactory、Filed、Method、Constructor类

    //by yan 20191206 Java的反射机制,它的定义是:程序在运行中时,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性.简单的来说就是 ...

  6. 手机 查看java源码_pin.java 源代码在线查看 - 一个专门为手机写的程序 资源下载 虫虫电子下载站...

    /*********************************************************************** * * *软件:公交路线选择软件 *作者:李蛟 *学校 ...

  7. 深入学习java源码之 Arrays.sort()与Arrays.parallelPrefix()

    深入学习java源码之 Arrays.sort()与Arrays.parallelPrefix() Comparator接口 能对不同类型的对象进行排序(当然排序依据还是基本类型),也不用自己实现排序 ...

  8. 【Android Gradle】安卓应用构建流程 ( Java 源码编译 和 AIDL 文件编译 )

    文章目录 一.安卓应用构建简介 二.Java 源码编译 三.AIDL 源码编译 一.安卓应用构建简介 使用 Android Studio 开发 Android 应用时 , 编译应用后在 Module ...

  9. java list e 查找_源码(04) -- java.util.ListE

    java.util.List 源码分析(JDK1.7) ------------------------------------------------------------------------ ...

  10. java源码 - ReentrantLock之FairSync

    开篇  这篇文章主要是讲解FairSync公平锁的源码分析,整个内容分为加锁过程.解锁过程,CLH队列等概念.  首先一直困扰我的CLH队列的CLH的缩写我终于明白,看似三个人的人名的首字符缩写&qu ...

最新文章

  1. K-近邻算法(KNN)概述
  2. socket的java实现_Socket之Java实现普通版本
  3. 【转】SQL Server联机丛书:存储过程及其创建
  4. 《Java核心技术》基于Java 17全面升级
  5. 2022年电工杯B题应急物资配送问题浅析
  6. QT从字体名获取字库文件路径(从宋体获取到simsun.ttc)
  7. win10无线网 服务器,win10专业版wifi变成地球怎么办_win10 wifi图标变成小地球无法连接网络如何解决...
  8. 市场调研报告-工业固体废物管理市场现状及未来发展趋势
  9. 【转载】史上最深(sàng)入(xīn)浅(bìng)出(kuáng)的IT术语解读【多测师_何sir】
  10. Word中硬回车与软回车的区别和用法
  11. 黑暗城堡(最短路径树)
  12. educoder Git进阶之合并远程分支、rebase、储藏
  13. 100个替代昂贵商业软件的开源应用/100 Open Source Replacements for Expensive Applications
  14. 十六进制转ASCII码表
  15. 我学ERP 之 金蝶ERP-K3_第4章 销售管理
  16. iPhone计算机没有删除键,iphone备份相片没删除键怎么用电脑删除
  17. h sm2 曲线参数_磁测量常用专业术语总结和磁性能参数对应的磁测量仪器
  18. 关于 AlphaBlend 和 32bpp 的反锯齿图标
  19. 企业破产重整网_最高法开通全国企业破产重整案件信息网
  20. 移动应用开发之路 01 Android Studio 项目文件介绍、创建虚拟机、完成第一个程序Hello World

热门文章

  1. 使用计时器setInterval实现倒计时
  2. 幸运福彩3d 是什么
  3. blender_(uv应用)................http://digitalman.blog.163.com/blog/static/23874605620174172058299/...
  4. FishC笔记—21 讲 函数:lambda表达式
  5. 基于Matlab的表面肌电信号处理软件设计与开发
  6. abaqus如何并行计算_Abaqus软件与并行计算的硬件配置
  7. 测试部门工作周报模板
  8. 度分秒换算题及答案C语言,度分换算(度分秒换算50题及答案)
  9. Android四大组件之广播
  10. 如何做数据仓库的有效需求分析