归并排序

示意图

归并排序示意图

实现

function mergeSort(arr) {
  const len = arr.length
  if (len < 2) {
    return arr
  }
  const middle = Math.floor(len/2)
  const left = arr.slice(0, middle)
  const right = arr.slice(middle)
  return merge(mergeSort(left), mergeSort(right))
}

function merge(arrA, arrB) {
  let lenA = arrA.length, i = 0
  let lenB = arrB.length, j = 0
  const result = []
  while (i < lenA && j < lenB) {
    if (arrA[i] > arrB[j]) {
      result.push(arrB[j++])
    } else {
      result.push(arrA[i++])
    }
  }
  while (i < lenA) {
    result.push(arrA[i++])
  }
  while (j < lenB) {
    result.push(arrB[j++])
  }
  return result
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

Reference