归并排序--学习

public class MergeSort {

    //辅助数组,负责保存归并子区间的结果
    static int[] assist = null;
    public static void main(String[] args) {
		// 归并排序就是将整个排序数组拆分成两个区间,然后对两个区间分别进行排序,
		// 再将两个区间的元素合并成有序的,以此递归下去,最终数组有序
		// 时间复杂度为:O(N*logN)
        int[] a = {9,8,7,6,5,4,3,2,1};
        sort(a);
        System.out.println(Arrays.toString(a));
    }

    //归并排序
    public static void sort(int[] a){
        //1.初始化辅助数组
        assist = new int[a.length];
        //2.归并排序
        sort(a,0,a.length - 1);
    }

    //对区间[l,r]进行排序
    public static void sort(int[] a, int l, int r){
        if(l >= r) return;
        //1.计算中间值
        int mid = (l + r)/2;
        //2.分别对子区间进行排序
        sort(a,l,mid);
        sort(a,mid+1,r);
        //3.对排序的子区间进行归并
        merge(a,l,mid,r);
    }

    //对区间[l,mid] 和 [mid+1,r]进行合并,结果存在辅助数组,然后覆盖回原数组中
    public static void merge(int[] a, int l, int mid, int r){
        int i = l;  //辅助数组的下标
        int p1 = l; //[l,mid]区间的下标
        int p2 = mid + 1; //[mid+1,r]区间的下标
        // 将a[p1]和a[p2]较小的元素复制到assist数组中
        while(p1 <= mid && p2 <= r){
            if(a[p1] > a[p2]){
                assist[i++] = a[p2++];
            }else{
                assist[i++] = a[p1++];
            }
        }
        // 将剩下的元素复制到assist数组中
        while(p1 <= mid) assist[i++] = a[p1++];
        while(p2 <= r) assist[i++] = a[p2++];

        //将辅助数组赋值回原来的数组中
        for(int index = l; index <= r; index++){
            a[index] = assist[index];
        }
    }
}
// [0, arr.length-1]
private static void process(int[] arr, int left, int right) {
        if(left == right){
            return;
        }

        int mid = left + (right - left) / 2;
        // 左边排好序
        process(arr, left, mid);
        // 右边排好序
        process(arr, mid + 1, right);
        // 合并
        merge(arr, left, mid, right);
    }

    private static void merge(int[] arr, int left, int mid, int right) {
        // 开辟数组
        int[] help = new int[right - left + 1];
        int i = 0;
        int l = left, r = mid + 1;
        // 将小的数赋值到help数组中
        while(l <= mid && r <= right){
            if(arr[l] < arr[r]){
                help[i++] = arr[l++];
            }else{
                help[i++] = arr[r++];
            }
        }
        // 将剩下的元素添加到help中
        while(l <= mid){
            help[i++] = arr[l++];
        }

        while(r <= right){
            help[i++] = arr[r++];
        }
        // 复制
        for(i = 0; i < help.length; i++){
            arr[left + i] = help[i];
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值