学习Python从娃娃抓起!记录下蓝桥杯备考比赛学习过程中的题目,记录每一个瞬间。
附上汇总贴:蓝桥杯备考冲刺必刷题(Python) | 汇总-CSDN博客
【题目描述】
城市图书馆决定对其藏书进行重新分类。他们决定使用希尔排序作为其分类方法的基础,但是有一些特殊的要求。
图书馆的每本书都有一个独特的ID,范围为
1
1
1到
N
N
N。每本书还有一个权重值,表示其在库中的重要性。图书馆希望按照权重对书进行排序,但是他们希望保留希尔排序的某些特性。
他们的要求如下:
- 使用希尔排序的增量序列: ⌊ N 2 ⌋ , ⌊ N 4 ⌋ , … , 1 \lfloor\frac{N}{2}\rfloor,\lfloor\frac{N}{4}\rfloor,\dots,1 ⌊2N⌋,⌊4N⌋,…,1。
- 当两本书的权重相同时,书籍ID较小的书应该出现在前面。
你的任务是根据这些要求,为图书馆排序其藏书。
【输入】
第一行:一个整数
N
N
N,表示图书的数量。
接下来的
N
N
N行:每行两个整数,分别是书籍的ID和权重,题目保证每本书的ID 都是唯一的。
【输出】
输出
N
N
N行,每行一个整数,按权重排序后的书籍ID。
【输入样例】
5
1 10
2 20
3 20
4 15
5 10
【输出样例】
1
5
4
2
3
【代码详解】
n = int(input()) # 输入n
class node: # 定义图书结构体
def __init__(self):
self.id = 0 # ID
self.w = 0 # 权重
temp = node()
def cmp(x, y): # 如果权重相同则更小的id放前面
if x.w==y.w:
return x.id<y.id
return x.w<y.w
def shellSort():
global n
global temp
gap = n // 2
while gap > 0: # 按照长度的一半进行排序,每循环一次,长度再减少一半
for i in range(gap, n): # 从gap点开始,由后向前进行比较
temp = a[i] # 与标准模板不同的是这里为结构体
j = i
while True:
if j >= gap and cmp(temp, a[j - gap]): # 如果前面的数比设定的值大
a[j] = a[j - gap] # 则将更大的值赋值给j,j每次减少gap长度
j -= gap
else:
break
a[j] = temp # 最后将较小的值赋值到更新后的j上
gap //= 2
a = [node() for i in range(100005)] # 初始化结构体数组
for i in range(n): # 输入n个数
a[i].id, a[i].w = [int(i) for i in input().split()]
shellSort() # 进行希尔排序
for i in range(n): # 输出n个数的ID
print(a[i].id)
【运行结果】
5
1 10
2 20
3 20
4 15
5 10
1
5
4
2
3