LeetCode:912. 排序数组

给你一个整数数组 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值