优选算法-分治-归并排序:47.归并排序

题目连接:912.排序数组(中等)

算法原理:

👉对应LeetCode题解

解法:归并排序

击败89.32%

时间复杂度O(Nlogn)

Java代码:

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 王洋
 * Date: 2025-09-07
 * Time: 16:52
 */
class Solution {
    //归并排序的解法
    //把临时数组定义为全局变量,避免多次创建,比原来快4ms
    int[]tmp;
    public int[] sortArray(int[] nums) {
        tmp=new int[nums.length];
        mergesort(nums,0,nums.length-1);
        return nums;
    }
    public void mergesort(int[]nums,int left,int right){
        if(left>=right) return;
        int mid=(left+right)/2;
        //先给左右排个序
        mergesort(nums,left,mid);
        mergesort(nums,mid+1,right);
        //合并后放在临时数组里
        // int[] tmp=new int[right-left+1];
        int cur1=left,cur2=mid+1,i=0;
        while(cur1<=mid&&cur2<=right)  tmp[i++]=nums[cur1]<=nums[cur2]?nums[cur1++]:nums[cur2++];
        //处理没有遍历完的数组
        while(cur1<=mid) tmp[i++]=nums[cur1++];
        while(cur2<=right) tmp[i++]=nums[cur2++];
        //还原:当前处理区间为[left,right]
        for(int j=left;j<=right;j++) nums[j]=tmp[j-left];//临时数组下标是从0开始的
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值