插入与归并(python)(原创)
根据维基百科的定义:
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。
归并排序进行如下迭代操作:首先将原始序列看成N个只包含1个元素的有序子序列,然后每次迭代归并两个相邻的有序子序列,直到最后只剩下1个有序的序列。
现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?
输入格式:
输入在第一行给出正整数N (<=100);随后一行给出原始序列的N个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。
输出格式:
首先在第1行中输出“Insertion Sort”表示插入排序、或“Merge Sort”表示归并排序;然后在第2行中输出用该排序算法再迭代一轮的结果序列。题目保证每组测试的结果是唯一的。数字间以空格分隔,且行末不得有多余空格。
输入样例1:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0
输出样例1:
Insertion Sort
1 2 3 5 7 8 9 4 6 0
输入样例2:
10 3 1 2 8 7 5 9 4 0 6 1 3 2 8 5 7 4 9 0 6
输出样例2:
Merge Sort
1 2 3 8 4 5 7 9 0 6
python源码实现:
1 # 模块化处理 2 """ 3 1,输入模块 4 2,直接插入排序判决 5 3,并归排序判决 6 4,输出 7 """ 8 9 10 def input_data(): # 输入模块 11 d0 = int(input()) 12 d1 = [int(x) for x in input().split()] 13 d2 = [int(x) for x in input().split()] 14 return d0, d1, d2 15 16 17 def dis_single(data, d0): # 逐位进行插入sort 18 state = 1 19 for i in range(len(data)): 20 if d0 < data[i]: 21 data.insert(i, d0) 22 state = 0 23 break 24 if state: 25 data.append(d0) 26 return data 27 28 29 def dis_sentence(d1, d2): # 插入排序判决 30 data = [] 31 state = 0 32 for i in range(len(d1)): 33 data = dis_single(data, d1[i]) 34 d_mid = data.copy() 35 d_mid.extend(d1[len(d_mid):]) 36 if d_mid == d2: 37 # print('Insertion Sort') 38 state = 1 39 data = dis_single(data, d1[i + 1]) 40 d_mid = data.copy() 41 d_mid.extend(d1[len(d_mid):]) 42 break 43 return [state, d_mid] 44 45 46 def list_sort(d0, d1): # 两个数组进行排序合并 47 index = 0 48 for i in range(len(d1)): # 遍历d1数组 49 state = 1 50 for j in range(index, len(d0)): # 遍历d0数组 51 if d0[j] > d1[i]: 52 state = 0 53 index = j + 1 54 d0.insert(j, d1[i]) 55 break 56 if state == 1: # 如果大于d0这个队列的所有值,那么直接extend所有数据 57 d0.extend(d1[i:]) 58 break 59 return d0 60 61 62 def ms_sentence(d1, d2): # 并归排序判决 63 data = [[x] for x in d1] 64 state = 0 65 while len(data) != 1: # 循环条件 66 length = len(data) 67 half = int(length / 2) # 除2的整数部分 68 quo = length % 2 # 除2的商 69 d0_mid = [] 70 for i in range(half): 71 d0_mid.append(list_sort(data[i * 2], data[i * 2 + 1])) 72 if quo: 73 d0_mid.append(data[-1]) 74 data = d0_mid.copy() 75 d0_mid = [] 76 for i in data: 77 for j in i: 78 d0_mid.append(j) 79 80 if d0_mid == d2: 81 state = 1 82 if state: 83 break 84 return [state, d0_mid] 85 86 87 def str_out(d0, d1): # 按格式进行输出 88 if d0[0]: 89 print('Insertion Sort') 90 str_ = str(d0[1][0]) 91 for i in d0[1][1:]: 92 str_ += ' ' + str(i) 93 print(str_) 94 if d1[0]: 95 print('Merge Sort') 96 str_ = str(d1[1][0]) 97 for i in d1[1][1:]: 98 str_ += ' ' + str(i) 99 print(str_) 100 101 102 if __name__ == "__main__": 103 d0, d1, d2 = input_data() 104 # d1 = [int(x) for x in '3 1 2 8 7 5 9 4 6 0'.split()] 105 # d2 = [int(x) for x in '1 2 3 7 8 5 9 4 6 0'.split()] 106 107 d3_1 = dis_sentence(d1, d2) 108 d3_2 = ms_sentence(d1, d2) 109 # print(d3_1, d3_2) 110 111 str_out(d3_1, d3_2)
探究未知是最大乐趣