归并排序--Java实现

package com.shusheng.mergeSort;

/**
 * 归并排序(作图分析)
 * @author Administrator
 *
 */
public class MergeSort {

    /**
     * 该方法会对array的first-between区间,between-last区间进行合并排序
     * (默认是这两个区间都已经分别排好序)
     * @param array 表示原始数组
     * @param first 表示第一个要排序区间的第一个下标
     * @param between,表示第一个要排序区间的最后一个下标,也作为第二个排序区间的第一个下标
     * @param last 第二个待排序区间的最后一个下标
     */
    private static void mergeSort(int[] array,int first,int between,int last) {
        int n1 = between-first+1;//因为first有可能等于零,下标可以从零开始,比如2-0=2,但其实数组大小应该为3,所以应该加1
        int n2 = last-between;//n1构造的数组已经包含了between下标的元素,所以n2就不用包含between下标的元素了
        int[] lArray = new int[n1];//该数组装载array的first到between下标的值
        int[] rArray = new int[n2];//该数组状态array的between到last的值
        int i,j,temp;
        //将first-between区间的元素拷贝到lArray数组,
        for (i=0,temp=first;temp<=between;) {
            lArray[i++] = array[temp++];
        }
        //将between+1到last的元素拷贝到rArray数组
        for (j = 0,temp = between+1;temp<=last;) {
            rArray[j++] = array[temp++];
        }
        //当i和j都没有移动到尽头时,对两个数组的第i个元素和第j个元素比较
        for(i=0,j=0;i<lArray.length&&j<rArray.length;){//i和j表示lArray移动的下标和rArray数组移动的下标
            if(lArray[i]<=rArray[j]){//如果lArray的第i个元素小于rArray的第j个元素,就将lArray的第i个元素拷贝到array中,first移动
                array[first++] = lArray[i++];
            }else {//同理
                array[first++] = rArray[j++];
            }
        }

        while(i<lArray.length){//当上面的循环有一个已经移动到尽头(j已经移动到尽头),就将lArray的剩下的值赋值给array,因为lArray已经是有序的
            array[first++] = lArray[i++];
        }
        while(j<rArray.length){//当上面的循环有一个已经移动到尽头(i已经移动到尽头),就将rArray的剩下的值赋值给array,因为rArray已经是有序的
            array[first++] = rArray[j++];
        }
    }

    /**
     * 归并排序的公开函数,
     * @param array 原始数组
     * @param first 表示待排区间的第一个下标
     * @param last表示待排区间的最后一个下标
     */
    public static void mergeSortMethod(int[] array,int first,int last){
        if(first>=last) return;//表示array的first和last指向同一个元素,只有一个元素就不用排序了,否则就继续分割
        int between = (first+last)/2;
        mergeSortMethod(array,first,between);//把要排序区间分割前一半进行递归排序
        mergeSortMethod(array,between+1,last);//把要排序区间的后一半进行递归排序
        //当执行到下面这个函数时,说明first-between区间,between-last区间都已经有序了,再合并这两个有序区间成为一个新的从first-last的有序区间
        mergeSort(array,first,between,last);
    }

    /**
     * 测试方法
     * @param args
     */
    public static void main(String[] args) {
        int[] args1 = {12,53,48,26,42,62,46,45};
        mergeSortMethod(args1,0,args1.length-1);
        for (int i = 0; i < args1.length; i++) {
            System.out.println(args1[i]);
        }
    }

}

有问题欢迎留言

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值