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 的数,就可以有效避免这个问题。
在操作中尽量避免对原始数据的直接修改。