插入与归并(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)
View Code

 

posted on 2019-03-19 17:03  周健康  阅读(517)  评论(0编辑  收藏  举报

导航