📜  谜题 65 |脱帽致敬(1)

📅  最后修改于: 2023-12-03 15:12:12.394000             🧑  作者: Mango

谜题 65 | 脱帽致敬

本谜题出自《编程珠玑》第二版的第八章,是一道考察排序算法的经典问题。

题目描述

给定一组整数,每个整数代表一个人的身高,要求将这组人按照身高从低到高排队。但是,出于敬意,我们要求身高相同的人按照其姓名的字典序从高到低排列。

例如,给定以下五个人的身高和姓名:

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 |