记录 1 道算法题
合并排序的数组
要求:将两个升序的数组进行合并,A 数组长度等于 A 数组内有值的数量加上 B 数组的元素数量。提供 m 为 A 数组内有值的数量, n 为 B 数组的长度。
比如:
A: [1,2,3,0,0,0] m = 3 B: [4,5,6] n = 3
输出 [1,2,3,4,5,6]
解题非常简单,这其实就是一个归并排序。需要思考的点在于如果不创建新的数组的话该如何实现。如果是从前面遍历的话,需要移动元素。那么如果从后面开始遍历就不需要移动元素。
function merge(A, m, B, n) {
// 找到最后的下标
let ai = m - 1
let bi = n - 1
// 还需要一个指针指向最后一个还没有赋值的地方。
let k = A.length - 1
// 接下来进行归并,由于 A 一定比 B 长,所以我们先以 B 的长度为循环的结束点。
while (bi >= 0) {
cosnt a = A[ai]
const b = B[bi]
if (a > b) {
A[k] = a
ai--
k--
} else {
A[k] = b
bi--
k--
}
}
// 接下来可能是 n 比 m 大的情况,就是 A 还没有值,k 还没到 0。
// 但是不需要处理,因为 A 前面的数本来就是升序的。
return A
}