MergeSort(Java)

来源:互联网 发布:项目性能优化 编辑:程序博客网 时间:2024/05/29 09:31

实现代码: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));    }}