根据维基百科的定义:
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确
的位置。如此迭代直到全部元素有序。
归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩
下1个有序的序列。
现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?
输入在第一行给出正整数N (<=100);随后一行给出原始序列的N个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以
空格分隔。
首先在第1行中输出“Insertion Sort”表示插入排序、或“Merge Sort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试
的结果是唯一的。数字间以空格分隔,且行末不得有多余空格。
10<br/>3 1 2 8 7 5 9 4 6 0<br/>1 2 3 7 8 5 9 4 6 0
Insertion Sort<br/>1 2 3 5 7 8 9 4 6 0
迭代归并排序,自己使用步长1,2,4,8.....解决
# -*- coding : utf-8 -*- def merge_sort(l,l2): i=2 count=0 while i<=len(l): result=[] for j in range(int(len(l)/i)): result+=merge(l[j*i:j*i+int(i/2)],l[j*i+int(i/2):j*i+i]) result+=l[int(len(l)/i)*i:] l=result.copy() if result==l2: count=i*2 if i==count: break i*=2 return result def merge(left, right): result = [] while len(left) > 0 and len(right) > 0: if left[0] <= right[0]: result.append(left.pop(0)) else: result.append(right.pop(0)) result += left result += right return result _ = input() l1 = list(map(int, input().split())) l2 = list(map(int, input().split())) # insert insert = l1.copy() merge_l = l1.copy() insert_flag = False count=0 for i in range(1, len(insert)): j = i - 1 temp = insert[i] while j >= 0 and insert[j] > temp: insert[j + 1] = insert[j] j -= 1 insert[j + 1] = temp if l2 == insert: insert_flag = True count=i+1 if i==count: break if insert_flag: print('Insertion Sort') print(' '.join([str(i) for i in insert])) else: print('Merge Sort') merge = merge_sort(merge_l,l2) print(' '.join([str(i) for i in merge]))
N = int(input()) original = [i for i in input().split()] tmp = [i for i in input().split()] def IsInsert(tmplist,b,c): a = [] for i in tmplist: a.append(i) flagI = False for i in range(1,c): coverflag = 0 if a == b: flagI = True for j in range(i,0,-1): if a[j] < a[j-1]: a[j-1],a[j] = a[j],a[j-1] else: if j == i: coverflag = 1 break if flagI and coverflag == 0: print('Insertion Sort') print(' '.join(a)) break def merge(left,right): l,r = 0,0 result = [] while l < len(left) and r < len(right): if left[l] <= right[r]: result.append(left[l]) l += 1 else: result.append(right[r]) r += 1 else: result += list(left[l:]) result += list(right[r:]) return result def IsMerge(tmplist,b,c): a = [] for i in tmplist: a.append(i) step = 1 flag2,flag3 = False,False OutList = [] while True: if OutList == b: flag2 = True List = [] OutList = [] if not flag3: for i in range(0,c,step): List.append(a[i:i+step]) for i in range(0,len(List),2): if i < len(List) - 1: OutList += merge(List[i],List[i+1]) else: OutList += merge(List[i],[]) if flag2: print('Merge Sort') print(' '.join(OutList)) break if flag3: break else: step = step * 2 a = OutList if step > c: flag3 = True IsInsert(original,tmp,N) IsMerge(original,tmp,N)
def get_list(list): my_list = [] for i in list: i = int(i) my_list.append(i) return my_list def get_insertion(fir_list, last_list, num): flag = 0 #fir_list.append('-9999') for i in range(num): if last_list[i] > last_list[i + 1]: flag = i + 1 break #fir_list.pop(-1) if fir_list[flag:] == last_list[flag:]: list = last_list[:flag + 1] list.sort() fir_list = list + last_list[flag + 1 :] return True, fir_list else: return False, [] def get_next_list(fir_list_1, num, k): i = 0 j = i + k + 1 my_list = [] while i <= num: list = [] list = fir_list_1[i:j] list.sort() i = j j = i + k + 1 my_list += list #print(list) return my_list num = int(input()) fir_list, last_list = input(), input() fir_list_1, last_list_1 = fir_list.split(), last_list.split() fir_list_2, last_list_2 = fir_list.split(), last_list.split() fir_list_1 = get_list(fir_list_1) fir_list_2 = get_list(fir_list_2) last_list_1 = get_list(last_list_1) last_list_2 = get_list(last_list_2) list = fir_list.split() list = get_list(list) list.sort() if list == last_list_1: pass else: flag, result_list = get_insertion(fir_list_1, last_list_1, num) if flag: print("Insertion Sort") for i in result_list: if i == result_list[-1]: print(i) else: print(str(i) + ' ', end = '') else: print("Merge Sort") flag = 0 i = 0 while i < num: k = 2 * i + 1 list = get_next_list(fir_list_2, num, k) if list == last_list_2: i = k k = 2 * i + 1 list = get_next_list(fir_list_2, num, k) break i = k for i in list: if i == list[-1]: print(i) else: print(str(i) + ' ', end = '')