PAT乙级 1035 插入与归并

题目:
在这里插入图片描述
在这里插入图片描述输入样例1:

10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0

输出样例1:

Insertion Sort
1 2 3 5 7 8 9 4 6 0

输入样例2:

10
3 1 2 8 7 5 9 4 0 6
1 3 2 8 5 7 4 9 0 6

输出样例2:

Merge Sort
1 2 3 8 4 5 7 9 0 6

分析:
这道题只有两种情况,要么是插入排序,要么是归并排序。
相比而言,我们更容易发现插入排序的规律,故先判断是否是插入排序,那么就循环获取插入排序的下一步结果直到与中间结果相等,那么按题目要求输出;
若得到最终排序结果后仍没能与中间结果相等则是归并排序,题中的归并是两边同时开始的,那么就循环获取归并的下一步结果直到与中间结果相等按题目要求输出。
代码如下(Python):

n = int(input())
c = [int(x) for x in input().split()]  # 未排序数列
m = [int(x) for x in input().split()]  # 中间结果
flag = False
for i in range(2, n):  # 判断是否是插入排序
    t1 = c[:i]
    t1.sort()
    t1.extend(c[i:])
    if flag:
        print('Insertion Sort')  
        print(' '.join(map(str, t1)))
        break
    if t == m:  # 发现相等后再获取一个结果再输出
        flag = True
if not flag:  # 到这一步已经判定是归并排序
    print('Merge Sort')
    k = 1
    t2 = []
    while not flag:
        if t == m:  # 发现相等后再获取一个结果再输出
            flag = True
        t2 = []
        k *= 2
        for i in range(n//k): # 每执行一次就得到归并的下一步结果
            t2 += sorted(c[i*k:(i+1)*k])
        t2 += sorted(c[n-n%k:n])
    print(' '.join(map(str, t2)))
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

~豆沙味的旺仔

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

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

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

打赏作者

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

抵扣说明:

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

余额充值