算法系列-第十六题

82 阅读1分钟

题目名称:排序数组(快速排序)

给你一个整数数组 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));

}