在 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)),并且是稳定排序,适用于需要保持相同元素相对顺序的场景。
标签:mergeSort,归并,递归,js,result,数组,排序 From: https://www.cnblogs.com/jocongmin/p/18301132