分治法-归并排序

算法思想:分治法

实际问题:归并排序

编写语言:Java

Java代码

//本篇博文代码是递归方式归并排序算法的实现
public class MergeSort
{
    public static void main(String[] args)
    {
        int[] ary = new int[] {1, 3, 4, 5, 2, 7, 0, 6, 9, 8};

        System.out.print("排序前的数组:");
        for(int i = 0; i < ary.length; i++)
            System.out.print(ary[i] + " ");
        System.out.println();

        sort(ary);

        System.out.print("排序后的数组:");
        for(int i = 0; i < ary.length; i++)
            System.out.print(ary[i] + " ");
        System.out.println();
    }

    public static int[] sort(int[] a)
    {
        return sort(a, 0, a.length - 1);
    }

    public static int[] sort(int[] a, int low, int high)
    {
        //low == high 说明两者相遇,即数组大小为1
        if(low < high) //当数组尺寸不为1的时候进行递归排序操作
        {
            int mid = (low + high) / 2;
            sort(a, low, mid); //对左半部分排序
            sort(a, mid + 1, high); //对右半部分排序
            //对左右两半部分排序后,两者都有序,
            //但左半部分的值不一定小于右半部分,所以需要归并整理
            merge(a, low, mid, high); //归并
        }

        return a;
    }

    public static int[] merge(int[] a, int low, int mid, int high)
    {
        int[] r = new int[high - low + 1]; //下表从零开始,数组大小多1
        //i为待返回结果数组起点,j为左半部分数组起点,k为右半部分数组起点
        int i = 0, j = low, k = mid + 1;

        while(j <= mid && k <= high)
        {
            if(a[j] < a[k])
                r[i++] = a[j++];
            else
                r[i++] = a[k++];
        }
        //若有左半部分一个元素未加入 result 数组,此处可解决这个问题
        while(j <= mid)
            r[i++] = a[j++];
        //若有由半部分一个元素未加入 result 数组,此处可解决这个问题
        while(k <= high)
            r[i++] = a[k++];

        //将result数组拷入原数组对应位置
        System.arraycopy(r, 0, a, low, r.length);

        return a;
    }
}

运行结果

结果示例