zoukankan      html  css  js  c++  java
  • 插入与归并(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
  • 相关阅读:
    案例分析
    阅读任务
    准备工作
    课程总结
    十三周总结
    第十二周总结
    第十一周学习总结
    第十周学习总结
    第九周课程总结&实验报告7
    第八周课程学习总结与实验6
  • 原文地址:https://www.cnblogs.com/Mufasa/p/10559819.html
Copyright © 2011-2022 走看看