归并排序学习笔记

61 阅读1分钟
class Sort {
  constructor(array) {
    this.array = array
    // 用于保存 [left,mid)
    this.leftArr = []
    this.sort(0, array.length)
  }

  sort(begin, end) {
    if (end - begin < 2) return;

    let mid = (begin + end) >> 1
    this.sort(begin, mid)
    this.sort(mid, end)
    this.merge(begin,mid,end)
  }

  merge(begin, mid, end) {
    // let li = begin, le = mid, ri = mid,re = end;
    // let ai = begin; // 正在比较的元素位置

    // // 复制 左边元素
    // for (let i = begin; i < le; i++) {
    //   this.leftArr[i] = this.array[i]
    // }
    let li = 0,le = mid - begin,ri = mid, re = end;
    let ai = begin;

    for (let i = li; i < le; i++) {
      this.leftArr[i] = this.array[begin + i]
    }

    while(li < le) {
      if (ri < re && this.array[ri] < this.leftArr[li]) {
        this.array[ai++] = this.array[ri++]
      } else {
        this.array[ai++] = this.leftArr[li++]
      }
    }
  }
}