PAT (Basic Level) Practice 1035 插入与归并 (25分) Python非递归实现(测试点2有坑)

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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值