📅  最后修改于: 2023-12-03 15:12:12.394000             🧑  作者: Mango
本谜题出自《编程珠玑》第二版的第八章,是一道考察排序算法的经典问题。
给定一组整数,每个整数代表一个人的身高,要求将这组人按照身高从低到高排队。但是,出于敬意,我们要求身高相同的人按照其姓名的字典序从高到低排列。
例如,给定以下五个人的身高和姓名:
66 Jackson
76 Jackson
72 Andy
72 Bob
71 Bob
按照题目要求排队后的顺序应该是:
66 Jackson
71 Bob
72 Bob
72 Andy
76 Jackson
请编写程序,给出按照题目要求排队后的顺序。
本题看似简单,实则有些需要考虑的细节。
首先,我们需要读入所有的数据,并按照身高从低到高进行排序。这可以使用任何一种排序算法完成。另外,因为我们需要在身高相同的人之间按照姓名排序,所以在排序时需要使用一种稳定的排序算法,例如归并排序或插入排序。
其次,我们需要处理相同身高的人之间的排序关系。这可以在排序函数中完成,具体地,在排序时,我们可以在比较节点的身高时,如果身高相等,就比较两个节点的姓名,将姓名字典序小的节点放在前面。这样可以保证相同身高的节点之间按姓名字典序从高到低排列。
最后,我们需要将排好序的结果输出。由于题目要求输出格式为 markdown 格式,所以我们需要将数据格式化为 markdown 表格,再输出。具体格式如下:
| Height | Name |
|:------:|:----:|
| 66 | Jackson |
| 71 | Bob |
| 72 | Bob |
| 72 | Andy |
| 76 | Jackson |
下面是使用 Python 实现的代码片段,可以和 markdown 格式配合使用输出结果。
data = [
(66, 'Jackson'),
(76, 'Jackson'),
(72, 'Andy'),
(72, 'Bob'),
(71, 'Bob')
]
def sort_data(data):
def cmp(x, y):
if x[0] != y[0]:
return x[0] - y[0]
else:
return -1 if x[1] > y[1] else 1
return sorted(data, cmp=cmp)
def convert_to_markdown(data):
header = "| Height | Name |"
line = "|:------:|:----:|"
rows = [header, line]
for d in data:
rows.append("| {} | {} |".format(d[0], d[1]))
return "\n".join(rows)
sorted_data = sort_data(data)
print(convert_to_markdown(sorted_data))
输出结果为:
| Height | Name |
|:------:|:----:|
| 66 | Jackson |
| 71 | Bob |
| 72 | Bob |
| 72 | Andy |
| 76 | Jackson |