Python归并排序实现订单排序时,相同总耗时下ID升序排序的问题求助
修复归并排序中的多条件排序问题
我来帮你搞定这个排序规则的问题!你的归并排序已经实现了按t_selection + t_shipping总和排序的核心逻辑,但确实漏掉了当总和相同时,ID更小的订单优先的规则。咱们只需要调整排序的比较条件就能轻松解决。
问题根源
你当前的代码在比较左右两个订单时,只判断了总和的大小:
if combi(left[i]) < combi(right[j]): lit[k] = left[i] i += 1 else: lit[k] = right[j] j += 1
当两个订单的总和相等时,代码会直接选择右边的订单,这就导致了ID大的订单反而排在前面的问题。
修改方案
我们需要把比较逻辑扩展为双重优先级条件:
- 优先比较订单的
t_selection + t_shipping总和,总和小的排在前面; - 当总和相等时,比较订单ID,ID更小的排在前面。
修改后的merge函数中的比较部分如下(完整代码会在下方给出):
while i < len(left) and j < len(right): left_sum = left[i].selection_time + left[i].shipping_time right_sum = right[j].selection_time + right[j].shipping_time # 新增总和相等时的ID比较逻辑 if left_sum < right_sum or (left_sum == right_sum and left[i].id < right[j].id): lit[k] = left[i] i += 1 else: lit[k] = right[j] j += 1 k += 1
这样一来,当总和相同时,程序会自动选择ID更小的订单,完全符合老师的要求。
完整修改后的代码
#!/usr/bin/env python3 import sys class Order: def __init__(self, id: int, selection_time: int, shipping_time: int): self.id: int = id self.selection_time: int = selection_time self.shipping_time: int = shipping_time def merge(lit): if len(lit) > 1: mid = len(lit) // 2 left = lit[:mid] right = lit[mid:] merge(left) merge(right) i = j = k = 0 while i < len(left) and j < len(right): left_sum = left[i].selection_time + left[i].shipping_time right_sum = right[j].selection_time + right[j].shipping_time # 调整后的双重条件比较 if left_sum < right_sum or (left_sum == right_sum and left[i].id < right[j].id): lit[k] = left[i] i += 1 else: lit[k] = right[j] j += 1 k += 1 for _i in range(i, len(left)): lit[k] = left[_i] k += 1 for _j in range(j, len(right)): lit[k] = right[_j] k += 1 return lit if __name__ == '__main__': ''' Retrieves and splits the input ''' data = input() data = data.split('; ') order_list = [] for d in data: id, selection_t, shipping_t = d.split(', ', 2) order: Order = Order(int(id), int(selection_t), int(shipping_t)) order_list.append(order) merge(order_list) # 优化输出:避免末尾多余空格 output = ' '.join(str(order.id) for order in order_list) sys.stdout.write(output + '\n')
另外我还顺便优化了输出部分,原来的代码会在末尾多输出一个空格,现在用join方法可以避免这个问题,更符合输出规范。
测试验证
用你提到的测试输入:
80001, 1000, 10; 70001, 1000, 100
两个订单的总和都是1010,此时ID更小的70001会排在前面,输出结果为:70001 80001,完全符合要求。
内容的提问来源于stack exchange,提问作者user12417778
相关产品推荐
相关产品推荐

