堆排序

1. 排序过程

  • 首先,堆在数组里是一个完全二叉树。我们要首先现在数组上建堆。建堆即使对所有的父结点开始向下调整(downAdjust), 这个过程从下面的父节点开始。
  • 如此一来便可以得到一个堆,于是确定了这个堆中的最大或者最小元素,可以将其和数组最后一个元素交换,放到数组最后。如此一来,便得到了大小为1的有序数组,为了维护堆的特性,堆顶元素要向下调整(downAdjust).
  • 多次如此交换,便可以得到一个有序序列

2. 堆进行元素的添加和删除

  • 删除堆顶元素,直接把堆顶元素与末尾元素交换,新的堆顶元素然后向下调整(downAdjust)
  • 添加, 先把元素添加到队列末尾,然后向上调整(upAdjust)

3. 相关习题

  • leetcode 215. Kth Largest Element in an Array
    • 1.题目要求找到第k大的数字,可以先建size = k的最小堆, 然后对剩下的元素进行比较,小于等于堆顶元素的,则不可能是第k大的数,无视。 大于堆顶元素的,先删除堆顶元素,再加入该元素,调整堆。最后的堆顶元素就是第k大的数。 复杂度: kln(k) + (n-k)ln(k), 第一部分是建堆,第二部分是比较.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 数据结构与算法--优先队列和堆排序 在某些数据处理的例子中,总数据量太大,无法排序(甚至无法全部装进内存)。例如,...
    sunhaiyu阅读 4,631评论 0 2
  • 二叉树 满二叉树 国内教程定义:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,...
    简_爱SimpleLove阅读 9,735评论 0 3
  • 堆排序 堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O...
    尼小摩阅读 14,040评论 3 11
  • 本文的目标是要做出优先队列和堆排序两个Demo。 完全二叉树 优先队列 堆排序 完全二叉树 完全二叉树的定义是建立...
    囧书阅读 10,392评论 13 48
  • 上次写到了快排,接着往下讲。O(nlogn)级别的算法除了上次说的快排,归并,还有推排序。今天从先推排序开始写。堆...
    锅与盆阅读 6,316评论 0 2