给定一个整数数组
nums
,将该数组升序排列。
示例 1:
输入:[5,2,3,1]
输出:[1,2,3,5]
示例 2:
输入:[5,1,1,2,0,0]
输出:[0,0,1,1,2,5]
提示:
1 <= A.length <= 10000
-50000 <= A[i] <= 50000
用归并排序解决此题,时间复杂度为 nlogn
class Solution {
public int[] sortArray(int[] nums) {
mergeSort(nums, 0, nums.length - 1);
return nums;
}
public void mergeSort(int[] array, int startIndex, int endIndex) {
if (startIndex >= endIndex) {
return;
}
// 获取最中间的元素索引
int middleIndex = (startIndex + endIndex) / 2;
// 左半边排序
mergeSort(array, startIndex, middleIndex);
// 右半边排序
mergeSort(array, middleIndex + 1, endIndex);
// 合并左右排序结果
merge(array, startIndex, endIndex);
}
public void merge(int[] array, int startIndex, int endIndex) {
// 零时数组用来存放排好序的元素,因此归并排序的空间复杂度为 O(n)
int[] tmp = new int[endIndex - startIndex + 1];
int middleIndex = (startIndex + endIndex) / 2;
int i = startIndex;
int j = middleIndex + 1;
int k = 0;
while (i <= middleIndex && j <= endIndex) {
// 从此处可以看出归并排序为原地排序,不会打乱本来的顺序
if (array[i] <= array[j]) {
tmp[k++] = array[i++];
} else {
tmp[k++] = array[j++];
}
}
int start = i;
int end = middleIndex;
if (i > middleIndex) {
start = j;
end = endIndex;
}
while (start <= end) {
tmp[k++] = array[start++];
}
// 将零时数组中的元素转入原数组
for (int m = 0; m < tmp.length; m++, startIndex++) {
array[startIndex] = tmp[m];
}
}
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于