归并排序算法


import java.util.Arrays;

/**
 * 归并排序算法
 * 中心思想:先将数组进行拆分,从中心一分为二,重复操作,直到剩下一个元素
 *         接着对拆分后的数组重新进行组合,形成新的数组,组合过程中,进行排序
 *         利用递归的思路进行拆分,直到剩下一个元素
 */
public class MergeSort {

    public static int[] mergeSort(int[] array){
        int size = array.length;
        if (size < 2){
            return array;
        }
        int mid = size >> 1; // 右移位1相当于除以2
        // 将数组拆分为从0到中间位置
        int[] leftArray = Arrays.copyOfRange(array,0,mid);
        // 从中间位置到末尾
        int[] rightArray = Arrays.copyOfRange(array,mid,size);
        return merge(mergeSort(leftArray),mergeSort(rightArray));
    }

    /**
     * 数组合并操作,整个大数组依次循环,进行数据对比
     * 对比时,先比较当前数组下标是否越界,如发生越界,则说明越界侧数组已经完全合并入新数组
     * @param left
     * @param right
     * @return
     */
    public static int[] merge(int[] left,int[] right){
        int[] newArray = new int[left.length+right.length];
        int leftIndex = 0; // 记录左边数组遍历的下标
        int rightIndex = 0; // 记录右边数组遍历的下标
        for (int i = 0 ;i < newArray.length;i++){
            if(leftIndex >= left.length){
            	// 左侧数组越界,新数组增加右侧数组的元素
                newArray[i] = right[rightIndex++];
            } else if (rightIndex >= right.length){
                // 右侧数组越界,新数组增加左侧数组的元素
                newArray[i] = left[leftIndex++];
            } else if (left[leftIndex] > right[rightIndex]){
            	// 左侧数组***大于***右侧数组的元素,因此增加右侧数组的元素进新数组
                newArray[i] = right[rightIndex++];
            } else if(left[leftIndex] < right[rightIndex]){
            	// 左侧数组***小于***右侧数组的元素,因此增加左侧数组的元素进新数组
                newArray[i] = left[leftIndex++];
            }
        }
        return newArray;
    }

    public static void main(String[] args) {
        int[] array = {5,3,1,6,4,7,0,9,10};
        int[] ints = mergeSort(array);
        System.out.println(Arrays.toString(ints));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值