有序数组合并

算法题其实不要慌就行了,就是太久没做了。

题:有3个数组从小到大,写一段代码合并成一个数组,并保证顺序

 

大致思路:

1. 拆成两个数组合并

2. 构造一个新数组,为的是不影响原数组,而且修改数组比插入数字消耗少

3. 因为源数组本身有序,所以可根据顺序,减少运算次数

4. 结果数组弄个游标,初始为0,记录操作位置,从两个数组取出值比较,小的数加入到结果数组,再从小的数这个数组再取数比较,直到大于另外一个数组的数,时间复杂度为O(n)

代码:

# encoding='utf8'


def list_merge(list_a, list_b):
    '''返回两个数组合并的结果'''

    len_a = len(list_a)
    len_b = len(list_b)
    result = [None for i in range(len_a + len_b)]   # 构造返回数组
    cursor_r = -1       # result游标
    cursor_b = 0        # list_b游标

    # 依次从数组的最前面取出最小的数,更新到结果数组
    for item_a in list_a:
        for idx in range(cursor_b, len_b):
            cursor_r += 1       # 移动游标
            item_b = list_b[idx]
            if item_a > item_b:
                result[cursor_r] = item_b
                cursor_b += 1   # 移动list_b的游标
            else:
                result[cursor_r] = item_a   # 因为list_a是for循环遍历,所以不需要游标
                break   # 继续从list_a取数

    # 因为是采用两两比较,放入最小的数,所以会导致丢失最大的数,这里加入最大数
    last = max(a[-1], b[-1])
    result[-1] = last
    return result

if __name__ == '__main__':
    a = [1, 2, 3, 4, 5]
    b = [2, 3, 4, 6]
    c = list_merge(a, b)
    print(a,b)
    print(c)

猜你喜欢

转载自www.cnblogs.com/lurenjia1994/p/10575598.html