非原地分区
function merge(left, right) { var target = []; while (left.length > 0 && right.length > 0) { target.push(left[0] < right[0] ? left.shift() : right.shift()); } return target.concat(left, right);}function sortArray(nums) { if (nums.length <= 1) { return nums; } var mid = Math.floor(nums.length / 2); var left = nums.slice(0, mid); var right = nums.slice(mid); return merge(sortArray(left), sortArray(right));}
原地分区
function partition(nums, start, end) { if (start >= end) { return; } var mid = Math.floor((start + end) / 2); partition(nums, start, mid); partition(nums, mid + 1, end); merge(nums, start, mid, end);}function merge(nums, start, mid, end) { var i = start; var j = mid + 1; var target = []; while (i <= mid && j <= end) { if (nums[i] > nums[j]) { target.push(nums[j++]); } else { target.push(nums[i++]); } } while (i <= mid) { target.push(nums[i++]); } while (j <= end) { target.push(nums[j++]); } for (var k = 0; k < target.length; k++) { nums[start + k] = target[k]; }}function sortArray(nums) { if (nums.length <= 1) { return nums; } partition(nums, 0, nums.length - 1); return nums;}
总结