动图

代码

  1. const mergeSort = arr => {
  2. //采用自上而下的递归方法
  3. const len = arr.length;
  4. if (len < 2) {
  5. return arr;
  6. }
  7. // length >> 1 和 Math.floor(len / 2) 等价
  8. let middle = Math.floor(len / 2),
  9. left = arr.slice(0, middle),
  10. right = arr.slice(middle); // 拆分为两个子数组
  11. return merge(mergeSort(left), mergeSort(right));
  12. };
  13. const merge = (left, right) => {
  14. const result = [];
  15. while (left.length && right.length) {
  16. // 注意: 判断的条件是小于或等于,如果只是小于,那么排序将不稳定.
  17. if (left[0] <= right[0]) {
  18. result.push(left.shift());
  19. } else {
  20. result.push(right.shift());
  21. }
  22. }
  23. while (left.length) result.push(left.shift());
  24. while (right.length) result.push(right.shift());
  25. return result;
  26. };
  27. 作者:天明夜尽
  28. 链接:https://juejin.im/post/6844903895789993997
  29. 来源:掘金
  30. 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

https://juejin.im/post/6844903895789993997#heading-1