非原地分区

  1. function merge(left, right) {
  2. var target = [];
  3. while (left.length > 0 && right.length > 0) {
  4. target.push(left[0] < right[0] ? left.shift() : right.shift());
  5. }
  6. return target.concat(left, right);
  7. }
  8. function sortArray(nums) {
  9. if (nums.length <= 1) {
  10. return nums;
  11. }
  12. var mid = Math.floor(nums.length / 2);
  13. var left = nums.slice(0, mid);
  14. var right = nums.slice(mid);
  15. return merge(sortArray(left), sortArray(right));
  16. }

原地分区

  1. function partition(nums, start, end) {
  2. if (start >= end) {
  3. return;
  4. }
  5. var mid = Math.floor((start + end) / 2);
  6. partition(nums, start, mid);
  7. partition(nums, mid + 1, end);
  8. merge(nums, start, mid, end);
  9. }
  10. function merge(nums, start, mid, end) {
  11. var i = start;
  12. var j = mid + 1;
  13. var target = [];
  14. while (i <= mid && j <= end) {
  15. if (nums[i] > nums[j]) {
  16. target.push(nums[j++]);
  17. } else {
  18. target.push(nums[i++]);
  19. }
  20. }
  21. while (i <= mid) {
  22. target.push(nums[i++]);
  23. }
  24. while (j <= end) {
  25. target.push(nums[j++]);
  26. }
  27. for (var k = 0; k < target.length; k++) {
  28. nums[start + k] = target[k];
  29. }
  30. }
  31. function sortArray(nums) {
  32. if (nums.length <= 1) {
  33. return nums;
  34. }
  35. partition(nums, 0, nums.length - 1);
  36. return nums;
  37. }

总结

  • 原理:分而治之
  • 时间复杂度:O(nlogn)