JAVA数据结构与算法 之 归并排序

JAVA版本的归并排序算法如下

请大家指正,谢谢!

/**
 * User: cuitongxin
 * Date: 13-3-31
 */
public class MergeSort {

    public static int[]  a = {13,67,32,9,43,1,19,7,52,89,73,0,10,60,99,30};

    public static void main(String[] args) {

        int[] temp = new int[a.length];

        mergeSort(a,temp,0,a.length-1);

        System.out.println(Arrays.toString(a));

    }

    /**
     * 归并排序主算法
     * @param a 需要归并排序的数组
     * @param temp 归并排序的临时数组,用户存放排序前的分组数组数据
     * @param startIndex 数组的开始索引
     * @param endIndex 数组的结束索引
     */
    private static void mergeSort(int[] a, int[] temp, int startIndex, int endIndex) {
        //数组中的元素大于1个时开始排序
        if (startIndex < endIndex) {
            //确定分组的中间元素索引位置
            int middle = (startIndex + endIndex) / 2 ;
            //对分组后的左边组进行归并排序
            mergeSort(a,temp,startIndex,middle);
            //对分组后的右边组进行归并排序
            mergeSort(a,temp,middle+1,endIndex);
            //合并已排序好的两个组,形成一个有序组
            merge(a, temp, startIndex, middle, endIndex);
        }
    }

    /**
     * 合并算法
     * @param a 用户存放排序号的数据
     * @param temp 用于存放分组数组
     * @param startIndex 数组的整个起始索引
     * @param middle     数组的中间索引
     * @param endIndex   数组的结束索引
     */
    private static void merge(int[] a, int[] temp, int startIndex, int middle, int endIndex) {

        //把原数据放入临时数组中
        for (int i=0; i<a.length;i++){
            temp[i] = a[i];
        }

        int left = startIndex; //左边分组的起始索引
        int right = middle + 1;  // 右边分组的起始索引
        int index = startIndex;  //合并后数组的起始索引

        //对左边分组和右边分组进行循环比较
        while ((left <= middle) && (right <= endIndex)) {
            //如果左边分组当前的元素大于右边分组则把右边分组的元素放入排序好的数组中,else 执行相反操作
            if (temp[left] > temp[right]) {
                a[index++] = temp[right++];
            } else {
                a[index++] = temp[left++];
            }
        }

        //如果分组比较大小完成之后,发现左边组还有数据,则把左边组的数据复制到排序好的数组中
        while (left <= middle) {
            a[index++] = temp[left++];
        }

        //如果分组比较大小完成之后,发现右边组还有数据,则把左边组的数据复制到排序好的数组中
        while (right <= endIndex) {
            a[index++] = temp[right++];
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值