1035 插入与归并(关于测试点6)

1035 插入与归并 (25 分)

关于测试点6

当算法为归并算法时,不能简单的通过中间序列的前x位来判有序来判断当前排序进行了几次迭代。比如:

n=8
原始序列:1 2 3 8 4 3 1 2
中间序列:1 2 3 8 3 4 1 2

实际上上述例子只进行了一次归并排序,如果按照前四位有序来判断则会误认为进行了两次归并排序。修改该问题后通过测试点6。

其他测试点

通过简单测试(修改代码只提交归并排序答案或插入排序答案),可以发现测试点中0、2、4为插入排序,1、3、5、6为归并排序。

代码

def merge_or_insert(a,b,n):
    for i in range(n-1):
        if b[i]>b[i+1] :
            break
    for j in range(i+1,n):
        if a[j]!=b[j]:
            break
    if j==n-1:
        return 'Insertion Sort',i+1
    else:
        return 'Merge Sort',i+1
n=eval(input())
lst=list(map(int,input().split()))
lst_sorted=list(map(int,input().split()))
sort_name,sort_step=merge_or_insert(lst,lst_sorted,n)
lst_ans=[]
if sort_name=='Insertion Sort':
    lst_ans=sorted(lst_sorted[:sort_step+1])+lst_sorted[sort_step+1:]
else :
    flag=1
    while(flag):
        for i in range(0,n,sort_step):
            flag=0
            if lst_sorted[i:i+sort_step]!=sorted(lst_sorted[i:i+sort_step]):
                sort_step//=2
                flag=1
                break               
    while lst_sorted!=[]:
        lst_ans.extend(sorted(lst_sorted[:sort_step*2]))
        del lst_sorted[:sort_step*2]
    #lst_ans+=sorted(lst_sorted[:])
print(sort_name)
print(' '.join(map(str,lst_ans)))

测试结果

测试结果

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值