Loading

Python实现有序数组合并

有两个从小到大有序排列的数组,如下

arr1 = [1, 3, 4, 6, 10]

arr2 = [2, 5, 8, 11]

将其合并成一个新的从小到大排列的数组

分析:

  • 先考虑一个数和一个有序数组合并的情况
  • 考虑两个有序数组合并的情况

一个数和一个有序数组合并

可以先分析一个数和一个有序数组合并的情况,即将这个数和有序数组中的数依次比较(是否小于数组中的数),当条件成立时,在数组中插入这个数,跳出循环。

——注意:考虑数大于数组中的所有数的情况,此时,需要把数插入到数组的最后

程序如下:

arr1 = [1, 3, 4, 6, 10]
arr2 = 13
arr3 = arr1.copy()			# 复制数组1
i = 0
while i < len(arr1):
    if arr2 < arr1[i]:
        arr3.insert(i, arr2)
        break
    else:
        i += 1
else:
    arr3.insert(i, arr2)
print(arr3)

两个有序数组合并

将数组2中的每个数拿出来,即可等价为上述一个数与有序数组合并。

程序如下

arr1 = [1, 3, 4, 6, 10]
arr2 = [2, 5, 8, 11, 15]

arr3 = arr1.copy()         # 复制数组1
i = 0
for j in range(len(arr2)):
    while i < len(arr1):        # 用数组1而不要用新的数组3作为判断条件
        if arr2[j] < arr1[i]:
            arr3.insert(i+j, arr2[j])   # 插入数据
            break                       # 插入数据后选择下一个数据
        else:
            i += 1
    else:
        arr3 = arr3 + arr2[j:]          #若数大于数组1中的最后一个,直接拼接
        break
print(arr3)

——注意:while循环和if语句的条件用数组1做判断,不要用数组3,数组1是固定的,数组3会因为插入数据而变化,一开始我用数组3作条件,总是会超出数组的索引范围,没做出来。

如果直接使用 arr1 存储答案,在向数组中添加元素的过程中,列表内部的元素会变化,也就是说,我们丢失了 arr1 的原来的值。用 i调用原来列表中的元素与 arr2 中的元素进行比较,而向 arr3 中插入 arr2 的数,就可以有效避免这个问题。

在操作中尽量避免对原始数据的直接修改。

posted @ 2021-05-25 21:46  紫曜花  阅读(769)  评论(0编辑  收藏  举报