伪代码
Coddy 堆排序:数据结构与算法系列 课程的第 4 课,共 9 课。
siftDown(array, i, size):
loop:
largest = i
left = 2*i + 1
right = 2*i + 2
if left < size and array[left] > array[largest]: largest = left
if right < size and array[right] > array[largest]: largest = right
if largest == i: stop
swap array[i] and array[largest]
i = largest
heapSort(array):
n = length(array)
for i from n/2 - 1 down to 0: # build max-heap
siftDown(array, i, n)
for end from n-1 down to 1: # extract max repeatedly
swap array[0] and array[end]
siftDown(array, 0, end)- siftDown 会把过小的父节点向下推过较大的子节点,直到恢复最大堆属性。
size表示数组中仍属于堆的部分有多大。 - 构建阶段:对每个非叶节点向下筛选(从最后一个父节点,索引
n/2 - 1,一直到根节点),可以将任意数组转换为最大堆。 - 排序阶段:每一步都会把当前最大值移到末尾,并缩小堆,因此数组会从后往前依次填入排好序的元素。
亲手试试
这节课没有代码挑战。
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
堆排序:数据结构与算法系列中的所有课
自己练习: C 在线编译器