打赏
Fork me on GitHub

归并排序

package mytest;

import java.util.Arrays;

/**
 * @author :l_coil
 * @date :2021/12/11 9:29 下午
 * 归并排序
 */
public class MergeSort {
    public static void main(String[] args) {
        int[] ints = {3, 1, 4, 8, 7, 5, 2};
        int[] result = sort(ints);
        System.out.println(Arrays.toString(result));
    }

    public static int[] sort(int[] sourceArray) {
        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
        //只有一个元素
        if (arr.length < 2) {
            return arr;
        }
        // 取出将整体划分为 2 路的中间节点
        int middle = (int) Math.floor(arr.length / 2);

        // 递归划分子集—逐步裂变
        int[] left = sort(Arrays.copyOfRange(arr, 0, middle));
        int[] right = sort(Arrays.copyOfRange(arr, middle, arr.length));
        // 合并,通过改变递归数组的长度,逐步收拢子集
        return merge(left, right);
    }

    public static int[] merge(int[] left, int[] right) {
        int[] result = new int[left.length + right.length];
        int i = 0;
        // 归并已排序两个子集
        while (left.length > 0 && right.length > 0) {
            if (left[0] <= right[0]) {
                result[i++] = left[0];
                left = Arrays.copyOfRange(left, 1, left.length);
            } else {
                result[i++] = right[0];
                right = Arrays.copyOfRange(right, 1, right.length);
            }
        }
        // 假如两个数组大小比对排序合并之后,left数组还存有剩余比之前元素大的,直接将剩余元素添加到合并集
        while (left.length > 0) {
            result[i++] = left[0];
            left = Arrays.copyOfRange(left, 1, left.length);
        }
        // 假如两个数组大小比对排序合并之后,right数组还存有剩余比之前元素大的,直接将剩余元素添加到合并集
        while (right.length > 0) {
            result[i++] = right[0];
            right = Arrays.copyOfRange(right, 1, right.length);
        }

        return result;
    }
}

  

posted @ 2021-12-12 10:32  l-coil  阅读(12)  评论(0编辑  收藏  举报