给我一个归并算法的事例并附加注释
时间: 2024-05-02 18:21:31 浏览: 47
以下是一个归并排序算法的示例代码,附带注释:
```
function mergeSort(arr) {
if (arr.length <= 1) {
return arr; // 如果数组只有一个元素或为空,直接返回
}
const mid = Math.floor(arr.length / 2); // 找到数组的中间位置
const leftArr = arr.slice(0, mid); // 将数组拆分成左右两个子数组
const rightArr = arr.slice(mid);
return merge(mergeSort(leftArr), mergeSort(rightArr)); // 递归地对左右两个子数组进行归并排序,然后将它们合并
}
function merge(leftArr, rightArr) {
const result = []; // 新建一个空数组,用于存放合并后的结果
let leftIndex = 0;
let rightIndex = 0;
while (leftIndex < leftArr.length && rightIndex < rightArr.length) { // 循环比较左右两个数组中的元素
if (leftArr[leftIndex] < rightArr[rightIndex]) { // 如果左边的元素小于右边的元素
result.push(leftArr[leftIndex]); // 将左边的元素放入结果数组中
leftIndex++; // 左指针后移
} else {
result.push(rightArr[rightIndex]); // 将右边的元素放入结果数组中
rightIndex++; // 右指针后移
}
}
return result.concat(leftArr.slice(leftIndex)).concat(rightArr.slice(rightIndex)); // 将剩余的元素加入结果数组中
}
```
这个归并排序算法的时间复杂度为 O(n log n),其中 n 是待排序数组的元素个数。它的基本思想是将数组拆分成两个子数组,递归地对每个子数组进行排序,然后将它们合并成一个有序数组。在合并两个子数组时,需要比较它们的元素大小,并按顺序将它们放入一个新的数组中。最后,将两个子数组中剩余的元素加入结果数组中,即可得到完整的有序数组。