题目
给定一个长度为 n 的数组,请你编写一个函数,返回该数组排序后的结果。
数据范围: 0 ≤n≤1000000,数组中每个元素都满足 0 ≤val≤1000000000
要求:空间复杂度 O(n),时间复杂度 O(nlogn)
实例
输入:[5,2,3,1,4]
输出:[1,2,3,4,5]
解题思路
为达复杂度要求,采用归并排序,归并排序空间复杂度 O(n),时间复杂度 O(nlogn)
代码
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
* 将给定数组排序
* @param arr int整型一维数组 待排序的数组
* @return int整型一维数组
*/
public int[] MySort (int[] arr) {
// write code here
int[] res = new int[arr.length];
sort(arr,0,arr.length-1,res);
return res;
}
public void sort(int[] arr,int l,int r,int[] data){
if(l<r){
int middle = (l+r)/2;
sort(arr,l,middle,data);
sort(arr,middle+1,r,data);
merge(arr,l,middle,r,data);
}
}
public void merge(int[] arr,int l,int m,int r,int[] data){
int i = l;
int j = m + 1;
int t = 0;
while(i<=m &&j<=r){
if(arr[i]<=arr[j]){
data[t++] = arr[i];
i++;
}else{
data[t++] = arr[j];
j++;
}
}
while(i<=m){
data[t++] = arr[i++];
}
while(j<=r){
data[t++] = arr[j++];
}
t = 0;
while(l<=r){
arr[l++] = data[t++];
}
}
}
2021年10月13日