题目名称:排序数组(快速排序)
给你一个整数数组 nums,请你将该数组升序排列。
示例 1:
输入:nums = [5,2,3,1]
输出:[1,2,3,5]
示例 2:
输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]
/**
* 解法一:快速排序
* 思路:
* (1)快速排序的主要思想是通过划分将待排序的序列分成前后两部分,其中前一部分的数据都比后一部分的数据要小,
* (2)然后再递归调用函数对两部分的序列分别进行快速排序,以此使整个序列达到有序。
* 时间复杂度:O(nlogn)
* 空间复杂度:O(h),其中 h 为快速排序递归调用的层数。我们需要额外的 O(h) 的递归调用的栈空间,
* 由于划分的结果不同导致了快速排序递归调用的层数也会不同,最坏情况下需 O(n) 的空间,最优情况下每次都平衡,
* 此时整个递归树高度为 logn,空间复杂度为 O(logn)。
*/
function sortArray(nums: number[]): number[] {
const len = nums.length;
if (len === 0) return nums;
const midIndex = Math.floor(len / 2);
const midValue = nums.splice(midIndex, 1)[0];
const left: number[] = [];
const right: number[] = [];
// 注意: splice 会修改原数组,所以用 arr.length
for (let i = 0; i < nums.length; i++) {
const n = nums[i];
if (n < midValue) {
left.push(n);
} else {
right.push(n);
}
}
return sortArray(left).concat([midValue], sortArray(right));
}