Menu
CoddyTech

伪代码

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,一直到根节点),可以将任意数组转换为最大堆。
  • 排序阶段:每一步都会把当前最大值移到末尾,并缩小堆,因此数组会从后往前依次填入排好序的元素。

亲手试试

这节课没有代码挑战。

quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

堆排序:数据结构与算法系列中的所有课

自己练习: C 在线编译器