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