十大排序算法(JavaScript实现 )- 归并排序 Merge Sort

377 阅读1分钟
  1. 十大排序算法(JavaScript实现 )- 冒泡排序 Bubble Sort

  2. 十大排序算法(JavaScript实现 )- 选择排序 Selection Sort

  3. 十大排序算法(JavaScript实现 )- 插入排序 Insertion Sort

  4. 十大排序算法(JavaScript实现 )- 希尔排序 Shell Sort

  5. 十大排序算法(JavaScript实现 )- 快速排序 Quick Sort

  6. 十大排序算法(JavaScript实现 )- 归并排序  Merge Sort

  7. 十大排序算法(JavaScript实现 )- 计数排序 Count Sort

  8. 十大排序算法(JavaScript实现 )- 桶排序 Bucket Sort

  9. 十大排序算法(JavaScript实现 )- 基数排序 Radix Sort

  10. 十大排序算法(JavaScript实现 )- 堆排序 Heap Sort

概念

归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

图片.png

算法原理

首先,我们先来完成合并的方法,即是将两个有序子序列合并成一个有序序列。

比如以下例子:

图片.png

后面依此类推

图片.png

// 合并
function merge(arr, startIndex, midIndex, endIndex) {
  let i = startIndex
  let j = midIndex + 1
  let k = 0
  let temp = []

  while(i <= midIndex && j <= endIndex){
    if (arr[i] <= arr[j]) {
      temp[k++] = arr[i++]
    } else {
      temp[k++] = arr[j++]
    }
  }
  // 左侧数组已排序完毕, 右侧还有数据
  while(i <= midIndex) {
    temp[k++] = arr[i++]
  }
  while(j <= endIndex) {
    temp[k++] = arr[j++]
  }

  for(let index = 0; index < temp.length; index++) {
    arr[index + startIndex] = temp[index]
  }
}
// 归并排序
function mergeSort(arr, startIndex = 0, endIndex = arr.length - 1) {
  // 递归结束条件
  if (startIndex >= endIndex) {
    return
  }
  const midIndex = ~~((startIndex + endIndex) / 2)
  mergeSort(arr, startIndex, midIndex)
  mergeSort(arr, midIndex + 1, endIndex)
  merge(arr, startIndex, midIndex, endIndex)
}