[路飞] 合并排序的数组

55 阅读1分钟

记录 1 道算法题

合并排序的数组

leetcode-cn.com/problems/so…


要求:将两个升序的数组进行合并,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
    }