【PAT_Python解】1035 插入与归并

原题链接:

参考资料:

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新时代先锋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值