堆排序

堆排序是一种基于完全二叉树的排序算法,包括大顶堆和小顶堆。它通过数组存储完全二叉树以节省空间。插入和删除操作涉及堆化过程,堆化的时间复杂度为O(logn)。堆排序分为建堆和排序两个阶段,建堆时间复杂度为O(n),总的时间复杂度为O(nlogn)。由于其非连续的数据访问方式,堆排序对CPU缓存不友好,且在数据交互次数上多于快速排序,因此是不稳定的排序算法。
摘要由CSDN通过智能技术生成

概念

  • 定义
    • 完全二叉树
    • 节点的值不小(大)于子节点的值
    • 大顶堆,小顶堆
  • 数组存储:数组存储完全二叉树节省内存

操作

  • 插入
    • 元素放到堆的最后
    • 堆化(heapify): 从下往上或从上往下
  • 删除
    • 把最后一个元素移到删除元素的位置
    • 堆化:从上往下
  • 堆化:时间复杂度O(logn),和树高度成正比
  • 堆排序
    • 建堆: 时间复杂度:O(n)
      • 思路一:插入的方式(从前往后处理数据,从下往上堆化)
      • 思路二:从后往前处理数据,从上往下堆化( 从非叶节点开始堆化)
    • 排序
      • 第一个节点最大,放到最后,该节点排序完成
      • 堆化剩余节点(已排序节点无需堆化)
      • 重复该过程
    • 原地排序
    • 建堆时间复杂度O(n)
    • 排序时间复杂度O(nlogn)
    • 不稳定排序算法
  • 堆排序和快排
    • 堆排数据访问方式不友好(跳着访问,对CPU缓存不友好)
    • 同样的数据,堆排序数据交互次数多余快排(建堆改变了有序度,打乱已有排序)
class Heap {
   
    constructor() {
   
        this.arr = ['']      //数组,从下标1开始存储数据
    }

    setArr(arr) {
   
        this.arr = ['', ...arr]
    }

    display() {
   
        let {
    arr } = this
        arr = arr.slice(1)
        let len = arr.length
        let i = 0
        let h = 1
        let str = ''
        while (i < len) {
   
            let j = 0
            while (j++ < h) {
   
                if (arr[i] !== undefined) {
   
                    str += ' ' + arr[i]
                    i++
                }
            
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值