给你一个整数数组 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 <= nums.length <= 5 * 10^4
- -5 * 10^4 <= nums[i] <= 5 * 10^4
方法一:快速排序O(nlogn)
解题思路
1.先对数组进行对半,找一个基准元素(或者任意找基准都可以)
2.然后遍历数组中的元素,与基准进行大小比较,如果比基准元素小的则放在left数组,比基准元素大的则放在right数组
3.最后进行递归调用,并将left、基准元素、right三者合并成一个数组返回即可。
代码
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortArray = function(nums) {
if (nums.length <= 1) { return nums; }
var pivotIndex = Math.floor(nums.length / 2);
var pivot = nums.splice(pivotIndex, 1)[0]; // 基准元素
var left = [];
var right = [];
for (var i = 0; i < nums.length; i++){
if (nums[i] < pivot) {
left.push(nums[i]);
} else {
right.push(nums[i]);
}
}
return sortArray(left).concat([pivot], sortArray(right));
};
方法二:归并排序O(nlogn)
解题思路
1.首先把长度为n的输入序列分成两个长度为n/2的子序列
2.然后对这两个子序列分别采用归并排序
3.最后将两个排序好的子序列合并成一个最终的排序序列
代码
/**
* @param {number[]} nums
* @return {number[]}
*/
var sortArray = function(nums) {
var len = nums.length;
if(len < 2) {
return nums;
}
var middle = Math.floor(len / 2),
left = nums.slice(0, middle),
right = nums.slice(middle);
return merge(sortArray(left), sortArray(right));// 采用自上而下的递归方法
};
function merge(left, right)
{
var result = [];
while (left.length && right.length) {
if (left[0] <= right[0]) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}
while (left.length)
result.push(left.shift());
while (right.length)
result.push(right.shift());
return result;
}