原题链接:
参考资料:
1035 插入与归并 (25 point(s)) -- 数据点4 数据点5_pat 1035 测试点5-CSDN博客
1035 插入与归并 - PAT(Basic Level)Practice(通俗易懂,小白也能学会的简单方法)_python插入与归并1035-CSDN博客
Tips:以下Python代码仅个人理解,非最优算法,仅供参考!没有找到大佬们python版的AC代码,借助了AI完善代码,最终AC!
def check(a, b, pos):
# 定义一个函数,检查列表a从位置pos开始到末尾是否与列表b的相应部分相同
return all(a[i] == b[i] for i in range(pos, len(a)))
def main():
n = int(input())
v1 = list(map(int,input().split()))
v2 = list(map(int,input().split()))
# 找到v2中第一个不满足递增顺序的位置j
j = 0
while j < n - 1 and v2[j] <= v2[j + 1]:
j += 1
# 如果v1从位置j+1开始与v2相同,则认为是插入排序
if check(v1, v2, j + 1):
print("Insertion Sort")
# 对v2的未排序部分(及其前一个元素,如果j为0)进行排序
# 注意:这里我们实际上是在模拟插入排序的结果,而不是真正执行插入排序
v2[:j+2] = sorted(v2[:j+2])
# 输出排序后的v2
print(" ".join(map(str, v2)))
else:
# 否则,认为是归并排序(但这里的归并排序模拟并不准确)
print("Merge Sort")
# 初始化归并轮次的大小
k = 2
# 模拟归并排序的归并过程
# 注意:这里的模拟并不完全准确,因为它没有真正执行归并操作,只是通过分段排序来模拟
while k <= n:
# 对v1进行分段排序
for i in range(0, n, k):
v1[i:i+k] = sorted(v1[i:i+k])
# 检查排序后的v1是否与v2相同(从位置0开始)
if check(v1, v2, 0):
# 如果相同,则认为是归并排序的结果(尽管模拟并不完整)
# 这里再次加倍k并尝试再次排序,但根据题目描述,这步可能是多余的
k *= 2
for i in range(0, n, k):
v1[i:i+k] = sorted(v1[i:i+k])
# 输出排序后的v1
print(" ".join(map(str, v1)))
return # 提前结束函数
# 如果不相同,则继续下一轮归并(通过加倍k)
k *= 2
# 如果所有归并轮次后都不匹配(但在这个特定问题中,这种情况不会发生),则应该有一个备选方案
# 然而,由于题目已经给出了明确的排序类型(插入排序或归并排序),这里不需要备选方案
# 但为了代码的完整性,我们可以保留一个输出v1的语句(尽管在实际中不会被执行)
# print(" ".join(map(str, v1))) # 这行在实际情况下是多余的
if __name__ == "__main__":
main()