归并排序(JS)

 

// 为了方便一些调试场景,具体的外层函数表达式使用的是var声明语句

var merge_sort = function(arr) {
  sort(arr, 0, arr.length - 1);
};

var sort = function(a, l, r) {
  // 终止排序过程
  if (l >= r) return;
  // 递归拆分(1分2)
  const m = ((r - l) >> 1) + l;
  sort(a, l, m);
  sort(a, m + 1, r);
  // 合并子数组(2合1)
  if (a[m] > a[m + 1]) merge(a, l, m, r);
};

var merge = function(a, l, m, r) {
  const tmp = a.slice(l, r + 1);
  let i = l;
  let j = m + 1;
  for (let k = l; k <= r; k++) {
    if (i > m) {
      a[k] = tmp[j - l];
      j++;
    } else if (j > r) {
      a[k] = tmp[i - l]; 
      i++;
    } else if (tmp[i - l] <= tmp[j - l]){
      a[k] = tmp[i - l]; 
      i++;
    } else{
      a[k] = tmp[j - l];
      j++;
    }
  }
};

// -- 完善中

posted @ 2021-11-29 13:46  樊顺  阅读(94)  评论(0编辑  收藏  举报