深耕专业教研,探索前沿技术
信息技术来源:2026年5月浙江省普通高中适应性考试(义乌柯桥)

第 12 题

答案与解析

本题解析

参考答案

C

解题思路

程序在一轮扫描中比较并按条件交换相邻元素,随后递归调用sort继续处理,采用递归实现冒泡排序的多轮扫描。两种调用的扫描方向由k决定,需要结合扫描方向确定交换条件和下一轮的边界。

程序分析

for j in range(st, ed, k):
    if :
        a[j], a[j + k] = a[j + k], a[j]

本轮处理从st到ed的区间,两个端点都在其中。j从st开始按步长k移动,最后一次比较的位置是ed-k与ed。k=1时从左向右扫描,a[j]在左、a[j+k]在右;k=-1时从右向左扫描,a[j]在右、a[j+k]在左。条件成立时交换这两个相邻元素。

if st != ed:
    sort(a, st, , k)
return a

当st与ed不同时,程序继续递归调用,保持起点st和扫描方向k不变,通过第三个参数调整处理区间。st等于ed时,区间只剩一个元素,前面的for循环不执行,也不再递归,随后返回列表a。

填空分析

if <blank/>:

此处应填入相邻元素需要交换的条件。

  • k=1时要求升序,左侧a[j]大于右侧a[j+k]才需要交换,使较大的值向右移动。
  • k=-1时要求降序,此时a[j]在右、a[j+k]在左,仍是a[j]大于a[j+k]时需要交换,使较大的值向左移动。

因此两种调用都应使用a[j] > a[j + k]。扫描方向已经改变了两个比较对象的左右位置,无须再乘k反转比较关系。

sort(a, st, <blank/>, k)

按上述条件完成一轮后,当前区间的最大值被逐次交换到扫描终点ed:升序扫描将它移到最右端,降序扫描将它移到最左端。该位置已就位,下一轮应排除它。

起点st保持不变,终点沿扫描方向退回一步,因此应填ed - k:k=1时终点减1,k=-1时终点加1。这样区间逐轮缩小,直到st等于ed。