1035 插入与归并
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。
归并排序进行如下迭代操作:首先将原始序列看成 N 个只包含 1 个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下 1 个有序的序列。
现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?
Input
- 10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0
Output
- Insertion Sort
1 2 3 5 7 8 9 4 6 0
n = int(input().strip())
org_lst = list(map(int, input().strip().split()))
sort_lst = list(map(int, input().strip().split()))
tar = org_lst[:]
flag = None
for i in range(1, n):
if i > 1 and tar == sort_lst: # (i>1是测试点2的坑)
flag = 1
while i-1>=0 and tar[i-1] > tar[i]:
tar[i-1], tar[i] = tar[i], tar[i-1]
i -= 1
if flag == 1:
print('Insertion Sort')
for i in range(n):
if i == n-1:
print(tar[i])
else:
print(tar[i],end=' ')
break
if flag != 1:
def norecursionmerge(arr, low, mid, high):
left = arr[low:mid]
right = arr[mid:high]
i, j = 0, 0
ret = []
while i < len(left) and j < len(right):
if left[i] <= right[j]:
ret.append(left[i])
i += 1
else:
ret.append(right[j])
j += 1
ret += left[i:]
ret += right[j:]
arr[low:high] = ret
i = 1
while i < n:
low = 0
if org_lst== sort_lst:
flag = 0
while low < n:
mid = low + i
high = min(n, low+2*i)
if mid < high:
norecursionmerge(org_lst, low, mid, high)
low += 2*i
if flag == 0:
print('Merge Sort')
for i in range(n):
if i == n-1:
print(org_lst[i])
else:
print(org_lst[i],end=' ')
break
i *= 2
由于用的非递归看起来有点啰嗦,具体代码排版也没有深究。
测试点2的坑输入的是
- 3
- 1 3 2
- 1 3 2
按照插入排序1 3 2既可以是刚刚开始的时候也可以是第一步结束
如果刚刚开始那么下一步依然是1 3 2 如果是第一步结束那么下一步应该是1 2 3 但是显然测试将1 3 2 做为第一步结束后的,应该输出1 2 3