晚饭后,孩子摆出一堆积木,按大小叠成一座小塔,大的在下,小的在上。我突然想到,这不就是堆排序的核心思想吗?数据像积木一样排列,最大的总在最下面,一层层调整,最后依次拿走顶部最小的,顺序就出来了。
什么是堆排序
堆排序是一种利用“堆”这种数据结构来排序的方法。堆看起来像一棵树,但可以用数组表示。最常见的堆是大根堆——每个父节点都比它的子节点大。就像搭积木,底下的积木最大,越往上越小。
堆排序的三个步骤
第一步是建堆。把乱序的数据重新排列,形成一个大根堆。比如有数组 [4, 10, 3, 5, 1],通过从最后一个非叶子节点开始,不断向下调整,最终变成 [10, 5, 3, 4, 1]。
第二步是取出堆顶元素(也就是当前最大值),把它放到数组末尾。然后把堆的大小减一,再把剩下的元素重新调整成堆。
第三步重复第二步,直到所有元素都排好序。
代码实现(Python)
def heapify(arr, n, i):
largest = i
left = 2 * i + 1
right = 2 * i + 2
if left < n and arr[left] > arr[largest]:
largest = left
if right < n and arr[right] > arr[largest]:
largest = right
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, n, largest)
def heap_sort(arr):
n = len(arr)
# 建堆
for i in range(n // 2 - 1, -1, -1):
heapify(arr, n, i)
# 逐个提取元素
for i in range(n - 1, 0, -1):
arr[0], arr[i] = arr[i], arr[0]
heapify(arr, i, 0)
带孩子写代码时,可以把 heapify 函数比作“整理积木塔”。每次有人动了塔底,就要检查是不是还稳,不稳就调整一下。
为什么适合教孩子
堆排序不像冒泡排序那样慢吞吞,也不像快速排序那样难懂。它有明确的结构感和规则性,孩子能通过画图、动手模拟一步步理解。比如用扑克牌代表数字,摆成三角形,每次把最大的移到后面,剩下的再整理。
当孩子亲手把一组混乱的数字变得有序,眼睛里会闪出光。这不是冷冰冰的算法,而是一场有规则的游戏。他们学到的不只是“堆排序怎么实现”,更是如何把复杂问题拆解成小步骤去解决。
下次陪孩子玩积木时,不妨试试边搭边问:“如果要让最大的总在最底下,该怎么调整?”也许答案,就藏在那一块块叠起的积木里。