在 JavaScript 中实现归并排序可以通过递归的方式完成。归并排序使用了“分而治之”的策略,将数组递归地分成两个子数组,分别进行排序,然后将它们合并成一个有序数组。以下是一个简单的归并排序实现:
function mergeSort(arr) {
// 如果数组只有一个元素或为空,则直接返回数组
if (arr.length <= 1) {
return arr;
}
// 找到数组的中间点
const mid = Math.floor(arr.length / 2);
// 将数组分成两部分
const left = arr.slice(0, mid);
const right = arr.slice(mid);
// 递归地对左右两部分进行排序并合并
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
const result = [];
let i = 0;
let j = 0;
// 合并两个有序数组
while (i < left.length && j < right.length) {
if (left[i] < right[j]) {
result.push(left[i]);
i++;
} else {
result.push(right[j]);
j++;
}
}
// 将剩余的元素添加到结果中
return result.concat(left.slice(i)).concat(right.slice(j));
}
// 示例使用
const unsortedArray = [3, 6, 8, 10, 1, 2, 1];
const sortedArray = mergeSort(unsortedArray);
console.log(sortedArray);
代码解释
-
mergeSort
函数:- 如果数组的长度小于等于1,直接返回数组,因为这种情况下不需要排序。
- 找到数组的中间点
mid
,将数组分成两部分:左部分left
和右部分right
。 - 递归调用
mergeSort
对左右两部分进行排序,然后调用merge
函数将两部分合并。
-
merge
函数:- 初始化一个空数组
result
来存储合并后的结果。 - 使用两个指针
i
和j
分别遍历left
和right
数组。 - 比较
left
和right
中的元素,将较小的元素添加到result
中,指针相应地移动。 - 将剩余的元素(如果有)添加到
result
中。
- 初始化一个空数组
示例
const unsortedArray = [3, 6, 8, 10, 1, 2, 1];
const sortedArray = mergeSort(unsortedArray);
console.log(sortedArray); // 输出: [1, 1, 2, 3, 6, 8, 10]
这个实现展示了如何使用递归和合并步骤来完成归并排序。归并排序的时间复杂度始终为 (O(n \log n)),并且是稳定排序,适用于需要保持相同元素相对顺序的场景。
原理图
前端工程师、程序员
标签:
JavaScript
, 算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!