排序算法03-归并排序

与之前的排序不同,归并排序采用分而治之的算法设计思想,最终的时间复杂度为O(n\log n)

归并排序的实现步骤:

1.分割:不断的将数组分割成两个新数组,直到长度为1;

2.合并:合并的过程也就是排序的过程,将两个数组按元素大小顺序合并成一个新数组,直到全部合并;

实现原理如下图:

实现归并排序的简单程序如下:

    // 分割方法
    public static int[] mergeSort(int[] arr)
    {
        if (arr.length > 1)
        {
            int[] firstHalf = new int[arr.length / 2];
            System.arraycopy(arr, 0, firstHalf, 0, arr.length / 2);
            // 继续分割前半段
            mergeSort(firstHalf);
            int secondHalfLen = arr.length - arr.length / 2;
            int[] secondHalf = new int[secondHalfLen];
            System.arraycopy(arr, arr.length / 2, secondHalf, 0, secondHalfLen);
            // 继续分割后半段
            mergeSort(secondHalf);
            // 分割之后调用合并方法
            merge(firstHalf, secondHalf, arr);
        }
        return arr;
    }

    // 合并方法
    public static void merge(int[] arr1, int[] arr2, int[] temp)
    {
        int index1 = 0;
        int index2 = 0;
        int index3 = 0;
        while (index1 < arr1.length && index2 < arr2.length)
        {
            temp[index3++] = arr1[index1] < arr2[index2] ? arr1[index1++] : arr2[index2++];
        }
        while (index1 < arr1.length)
            temp[index3++] = arr1[index1++];
        while (index2 < arr2.length)
            temp[index3++] = arr2[index2++];
    }

猜你喜欢

转载自blog.csdn.net/qq_38258310/article/details/82416945