排序算法 - 归并算法

在实际应用当中,对于数据较大的输入,归并排序是比较快的一个算法。该算法采用的是分治法的思想。

原理:将数据分开排序,然后进行合并,最后形成一个排好的序列。

将其合并输出,如下图所示:

代码实现如下:

/**
 * 归并排序
 *
 * @author Deters
 * @date 2019/10/12
 */
public class MergeSort {

    /**
     * 归并
     */
    private static void merge(Integer[] array, int start, int end, int middle) {
        // 临时数组,储存左右分支合并之后的数组
        Integer[] temp = new Integer[end - start + 1];
        // 临时数组当前位置下标
        int index = 0;
        // 左分支下标
        int lCt = start;
        // 右分支下标
        int rCt = middle + 1;

        // 当左右分支都有数据时
        while (lCt <= middle && rCt <= end) {
            temp[index++] = array[lCt] - array[rCt] < 0 ? array[lCt++] : array[rCt++];
        }
        // 只有左分支有数据
        while (lCt <= middle) {
            temp[index++] = array[lCt++];
        }
        // 只有右分支有数据
        while (rCt <= end) {
            temp[index++] = array[rCt++];
        }

        for (int i = 0; i < temp.length; i++) {
            array[start++] = temp[i];
        }
    }

    /**
     * 分支排序
     */
    private static void mergeSort(Integer[] array, int start, int end) {
        int middle = start + (end - start) / 2;
        if (start < end) {
            // 左分支分割
            mergeSort(array, start, middle);
            // 右分支分割
            mergeSort(array, middle + 1, end);
            // 分支排序并合并
            merge(array, start, end, middle);
            System.out.println(Arrays.toString(array));
        }

    }

    public static void main(String[] args) {
        Random random = new Random();
        Integer[] integers = new Integer[8];
        // 建立数组
        for (int i = 0; i < 8; i++) {
            integers[i] = random.nextInt(10);
        }

        // 归并排序
        mergeSort(integers, 0, integers.length - 1);

    }

}

 

posted @ 2019-10-13 17:48  草莓罐头  阅读(241)  评论(0编辑  收藏  举报