一、归并排序

算法思想:分治策略

时间复杂度:O(n·logn)

空间复杂度:O(n·logn) 非原地算法

1.函数主体

public static void mergeSort(double[] a,int l,int r){
    if (l < r){
        int m = (l + r) / 2;//把数组分成等长的左右两个
        mergeSort(a, l, m);//递归左侧数组,使左侧数组有序
        mergeSort(a, m+1, r);//递归右侧数组,使右侧数组有序
        merge(a, l, m, r);//归并两个有序数组数组,得到一个完整的有序数组
    }
}

2. merge函数(归并函数)

merge函数所要做的,就是把两个有序数组合并成一个有序数组。

在这里插入图片描述

public static void merge(double[] a, int l, int m, int r){
    /*
     * 1.将待归并的两个数组复制入新的数组中,因此,我们说归并排序不是原地排序
     */
    double[] arr1 = new double[m - l + 2];
    double[] arr2 = new double[r - m + 1];
    for (int i = l ; i <= m ; i ++){
        arr1[i - l] = a[i];
    }
    for (int i = m + 1 ; i <= r ; i ++){
        arr2[i - m - 1] = a[i];
    }
    // 2.并令两个数组的最后一个元素是正无穷大。POSITIVE:正数,INFINITY:无穷大。
    arr1[arr1.length-1] = Double.POSITIVE_INFINITY;
    arr2[arr2.length-1] = Double.POSITIVE_INFINITY;
    
    /*
     * 3.将两个数组进行归并操作。即把两个有序数组合并成一个有序数组。
     */
    int i = 0,j = 0;//ij分别记录两个数组正在操作的位置
    for (int k = l ; k <= r ; k ++) {
        if (arr1[i] < arr2[j]) {
            a[k] = arr1[i];
            i++;
        } else {
            a[k] = arr2[j];
            j++;
        }
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值