堆排序

74 阅读1分钟
  • 首先对无序数组建堆,完全二叉树中最后一个非叶子结点的下标为n/2 - 1从n/2 - 1开始依次到root对其调整成堆即完成建堆。

    为什么建堆过程要从n/2->1而不是从1->n/2,因为从n/2到1可以永远保证以当前节点为根的二叉树的子树均为堆,故交换时,只需考虑当前根节点和其两个孩子节点的大小即可。

  • 建堆操作就是不断调整的过程。

  • Adjust()调整函数是核心,调整的操作就是不断下沉的过程。

  • 建推完成后,输出堆顶元素(即把堆顶元素和最后一个元素交换位置,然后将长度-1),然后再对root进行调整成堆的操作。循环此操作即完成排序。

  • T(n) = O(nlogn) ,与初始状态无关。

  • 不稳定

  • 比较适合n较大的文件