zoukankan      html  css  js  c++  java
  • 【数据结构与算法之美】堆和堆排序

    什么是堆

    1. 堆是一个完全二叉树

    tips:完全二叉树的特征是除最后一层,其他层的节点个数都是满的,最后一层的节点都靠左排列

    1. 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值
    • 大顶堆
    • 小顶堆

    如何实现一个堆

    1. 如何存储一个堆

    数组存储,.....数组存储的优势?

    1. 堆支持哪些操作?
      2.1 往堆里插入一个元素
      插入元素后,需继续满足堆的两个特性,这其中就有个堆化(heapify)的过程
      堆化方向:从下往上、从上往下
      堆化过程:顺着节点所在的路径,从下或者从上,对比,然后交互
      2.2 删除堆顶元素

    往堆中插入一个元素和删除堆顶元素的时间复杂度都是O(log n)

    如何基于堆实现排序?

    堆排序,时间复杂度O(n log n),原地排序算法

    1. 建堆
      从后往前处理数组,每个数据都是从上往下堆化,建堆的时间复杂度O(n)
    2. 排序
      移除堆顶元素,把下标为n的元素放堆顶,再通过堆化的方法,将剩下的n-1个元素重新构建成堆。
      堆排序的时间复杂度是O(n log n)

    为什么快速排序要比堆排序性能好?

    1. 堆排序数据访问的方式没有快速排序友好
    2. 同样数据,排序过程中,堆排序算法的数据交换次数要多于快速排序
  • 相关阅读:
    Java ee第七周作业
    Java ee第六周作业
    Java ee第五周作业
    Java ee第四周作业
    Java ee第三周作业
    第二周作业-web后台应用开发与xml
    Java ee第一周的作业
    在团队项目中我对自己的总结
    两人合作,黄金点游戏
    c语言实现wc功能
  • 原文地址:https://www.cnblogs.com/zendwang/p/heap-and-heap-sort.html
Copyright © 2011-2022 走看看