根据维基百科的定义:
插入排序是迭代算法,逐一获得输入数据,逐步产生有序的输出序列。每步迭代中,算法从输入序列中取出一元素,将之插入有序序列中正确的位置。如此迭代直到全部元素有序。
堆排序也是将输入分为有序和无序两部分,迭代地从无序部分找出最大元素放入有序部分。它利用了大根堆的堆顶元素最大这一特征,使得在当前无序区中选取最大元素变得简单。
现给定原始序列和由某排序算法产生的中间序列,请你判断该算法究竟是哪种排序算法?
输入格式:
输入在第一行给出正整数 n (<=100);随后一行给出原始序列的 n 个整数;最后一行给出由某排序算法产生的中间序列。这里假设排序的目标序列是升序。数字间以空格分隔。
输出格式:
首先在第 1 行中输出 Insertion Sort 表示插入排序、或 Heap 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 6 0
6 4 5 1 0 3 2 7 8 9
输出样例 2:
Heap Sort
5 4 3 1 0 2 6 7 8 9
def check_insertion_sort(original, target, n): """ 检查是否为插入排序,并返回下一轮结果 """ arr = original[:] # 模拟插入排序过程 for i in range(1, n): # 插入第i个元素 key = arr[i] j = i - 1 while j >= 0 and arr[j] > key: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key # 检查是否与目标序列匹配 if arr == target: # 找到匹配,进行下一轮插入 if i < n - 1: # 继续插入下一个元素 next_key = arr[i + 1] k = i while k >= 0 and arr[k] > next_key: arr[k + 1] = arr[k] k -= 1 arr[k + 1] = next_key return True, arr return False, Nonedef heapify(arr, n, i): """ 堆调整函数 """ largest = i # 初始化最大元素为根 left = 2 * i + 1 right = 2 * i + 2 # 如果左子节点存在且大于根 if left < n and arr[left] > arr[largest]: largest = left # 如果右子节点存在且大于当前最大值 if right < n and arr[right] > arr[largest]: largest = right # 如果最大值不是根 if largest != i: arr[i], arr[largest] = arr[largest], arr[i] # 交换 # 递归调整受影响的子树 heapify(arr, n, largest)def check_heap_sort(original, target, n): """ 检查是否为堆排序,并返回下一轮结果 """ arr = original[:] # 构建最大堆 for i in range(n // 2 - 1, -1, -1): heapify(arr, n, i) # 模拟堆排序过程 for i in range(n - 1, 0, -1): # 将当前根(最大值)移动到末尾 arr[0], arr[i] = arr[i], arr[0] # 对剩余元素进行堆调整 heapify(arr, i, 0) # 检查是否与目标序列匹配 if arr == target: # 找到匹配,进行下一轮堆排序 if i > 1: # 继续下一轮堆排序 arr[0], arr[i - 1] = arr[i - 1], arr[0] heapify(arr, i - 1, 0) return True, arr return False, Nonedef main(): # 读取输入 n = int(input().strip()) original = list(map(int, input().strip().split())) target = list(map(int, input().strip().split())) # 检查是否为插入排序 is_insertion, next_step = check_insertion_sort(original, target, n) if is_insertion: print("Insertion Sort") print(" ".join(map(str, next_step))) else: # 检查是否为堆排序 is_heap, next_step = check_heap_sort(original, target, n) if is_heap: print("Heap Sort") print(" ".join(map(str, next_step)))if __name__ == "__main__": main()
宋代史学家司马光在《资治通鉴》中有一段著名的"德才论":"是故才德全尽谓之圣人,才德兼亡谓之愚人,德胜才谓之君子,才胜德谓之小人。凡取人之术,苟不得圣人,君子而与之,与其得小人,不若得愚人。"现给出一批考生的德才分数,请根据司马光的理论给出录取排名。输入格式:输入第一行给出 3 个正整数,分别为:n(≤10^5),即考生总数;l(≥60),为录取最低分数线,即德分和才分均不低于 ll 的考生才有资格被考虑录取;h(<100),为优先录取线——德分和才分均不低于此线的被定义为"才德全尽",此类考生按德才总分从高到低排序;才分不到但德分到优先录取线的一类考生属于"德胜才",也按总分排序,但在第一类考生之后;德才分均低于 hh,但是德分不低于才分的考生属于"才德兼亡"但尚有"德胜才"者,按总分排序,但在第二类考生之后;其他达到最低线 ll 的考生也按总分排序,但在第三类考生之后。随后 n 行,每行给出一位考生的信息,包括:准考证号、德分、才分,其中准考证号为 8 位整数,德分为区间 [0,100] 内的整数。数字间以空格分隔。输出格式:输出第一行首先给出达到最低分数线的考生人数 m,随后 m 行,每行按照输入格式输出一位考生的信息,考生按输入中说明的规则从高到低排序。当某类考生中有多人总分相同时,按其德分降序排列;若德分也并列,则按准考证号的升序输出。import sysdef main(): # 读取输入 data = sys.stdin.read().strip().split() n, l, h = map(int, data[:3]) students = [] # 读取所有考生信息 for i in range(n): idx = 3 + i * 3 student_id = int(data[idx]) de = int(data[idx + 1]) cai = int(data[idx + 2]) students.append((student_id, de, cai)) # 分类存储 categories = [[] for _ in range(4)] # 0-3分别对应四类考生 # 统计达到最低分数线的考生 m = 0 for student_id, de, cai in students: # 检查是否达到最低分数线 if de >= l and cai >= l: m += 1 # 分类 if de >= h and cai >= h: # 第一类:才德全尽 categories[0].append((student_id, de, cai)) elif de >= h and cai < h: # 第二类:德胜才 categories[1].append((student_id, de, cai)) elif de < h and cai < h and de >= cai: # 第三类:才德兼亡但尚有德胜才 categories[2].append((student_id, de, cai)) else: # 第四类:其他达到最低线 categories[3].append((student_id, de, cai)) # 输出结果 print(m) # 对每个类别排序并输出 for category in categories: # 按总分降序、德分降序、准考证号升序排序 category.sort(key=lambda x: (-(x[1] + x[2]), -x[1], x[0])) for student in category: # 准考证号格式化为8位,不足8位前面补0 print(f"{student[0]:08d}{student[1]}{student[2]}")if __name__ == "__main__": main()