JavaScript 学习-归并排序

351 阅读1分钟

这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战

上一篇文章学习了排序方法, 另更多更文学习 JavaScript 的系列小总结请查看更多阅读:

本文来继续学习 JavaScript 中的排序方法: 在实际工作中经常用到排序算法

JavaScript 排序算法-归并排序

归并排序, 是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

JS-归并排序-代码实现

function mergeSort(arr) {
  // ...
  // 采用自上而下的递归方法
  var len = arr.length
  if (len < 2) {
    return arr
  }
  var middle = Math.floor(len / 2),
    left = arr.slice(0, middle),
    right = arr.slice(middle)
  return merge(mergeSort(left), mergeSort(right))
}

// 工具函数: 交换左右位置

function merge(left, right) {
  var result = []

  while (left.length && right.length) {
    if (left[0] <= right[0]) {
      result.push(left.shift())
    } else {
      result.push(right.shift())
    }
  }

  while (left.length) result.push(left.shift())

  while (right.length) result.push(right.shift())

  return result
}

测试用时:

// 引入下面的 测试代码耗时的方法: 进行测试希尔排序对处理20000+条数据的排序耗时:
getFnRunTime(mergeSort)

测试代码运行耗时的函数


const testArrFn = function() {
  let arr = []
  const count = 200000
  for (let i = 0; i < count; i++) {
    arr[i] = Math.floor(Math.random() * 50 + 1)
  }
  return arr
}
let testArr = testArrFn()

let len = testArr.length
/**
 * @desc 测试函数执行的时间
 */
module.exports = async function getFnRunTime(fn) {
  let startTime = Date.now(),
    endTime
  let result = await fn(testArr)
  endTime = Date.now()
  console.log(testArr, result)
  console.log(
    `total time: ${endTime - startTime}ms, `,
    "test array'length: " + len,
    result.length
  )
}

更多阅读