这是我参与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
)
}