非原地分区

  1. function sortArray(nums) {
  2. if (nums.length <= 1) {
  3. return nums;
  4. }
  5. var pivot = Math.floor(nums.length / 2);
  6. var left = [];
  7. var right = [];
  8. for (var i = 0; i < nums.length; i++) {
  9. if (i === pivot) {
  10. continue;
  11. }
  12. if (nums[i] < nums[pivot]) {
  13. left.push(nums[i]);
  14. } else {
  15. right.push(nums[i]);
  16. }
  17. }
  18. return sortArray(left).concat([nums[pivot]], sortArray(right));
  19. }

原地分区

  1. function swap(nums, x, y) {
  2. var temp = nums[x];
  3. nums[x] = nums[y];
  4. nums[y] = temp;
  5. }
  6. function partition(nums, start, end) {
  7. var pivot = start + Math.floor(Math.random() * (end - start + 1));
  8. swap(nums, pivot, end);
  9. for (var i = start; i < end; i++) {
  10. if (nums[i] <= nums[end]) {
  11. swap(nums, start++, i);
  12. }
  13. }
  14. swap(nums, start, end);
  15. return start;
  16. }
  17. function quickSort(nums, start, end) {
  18. if (start >= end) {
  19. return;
  20. }
  21. var pivot = partition(nums, start, end);
  22. quickSort(nums, start, pivot - 1);
  23. quickSort(nums, pivot + 1, end);
  24. }
  25. function sortArray(nums) {
  26. quickSort(nums, 0, nums.length - 1);
  27. return nums;
  28. }

总结

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