【算法】堆排序

算法-堆排序


前置知识
  • 堆(即将更新)

思路

我们现在有一个序列,怎么对它排序?

这是一个非常经典的问题,这里我们使用一个借助数据结构的算法------堆排序解决。

这里有一个序列,要对它升序排序
4 7 3 6 5 1 2 8 \begin{array}{cc} 4&7&3&6&5&1&2&8 \end{array} 47365128

构建一个堆:

将堆顶放入序列,删除堆顶

重复该操作





直至堆为空。

获得的序列为:
1 2 3 4 5 6 7 8 \begin{array}{cc} 1&2&3&4&5&6&7&8 \end{array} 12345678


算法参数
  • 平均时间复杂度: Θ ( n log ⁡ n ) \Theta(n\log n) Θ(nlogn)
  • 最好时间复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)
  • 最坏时间复杂度: O ( n log ⁡ n ) O(n\log n) O(nlogn)
  • 空间复杂度: Θ ( n ) \Theta(n) Θ(n)
  • 稳定性:不稳定

实现代码
  • 手写堆版本
cpp 复制代码
void heapify(int a[],int n,int i){//维护堆的性质
    int largest=i,l=2*i+1,r=2*i+2;
    if (l<n&&a[l]>a[largest])
        largest=l;
    if (r<n&&a[r]>a[largest])
        largest=r;
    if (largest!=i){
        swap(a[i],a[largest]);
        heapify(a,n,largest);
    }
}
void HeapSort(int a[],int n){//堆排序
    for (int i=n/2-1;i>=0;i--)
        heapify(a,n,i);
    for (int i=n-1;i>0;i--){
        swap(a[0],a[i]);
        heapify(a,i,0);
    }
}

练习
相关推荐
此生只爱蛋16 小时前
【CAD】Parasolid:CAD的os
c++
無限進步D16 小时前
Java 基础算法训练
java·开发语言·算法·入门
门左有棵树17 小时前
蓝桥杯C++组算法知识点整理(考前急救)
c++·算法·蓝桥杯
历程里程碑17 小时前
二叉树---二叉树的最大深度
大数据·数据结构·算法·elasticsearch·搜索引擎·全文检索·深度优先
自我意识的多元宇宙17 小时前
树与二叉树--树的基本概念
数据结构·算法
吃着火锅x唱着歌17 小时前
LeetCode 678.有效的括号字符串
算法·leetcode·职场和发展
不爱吃炸鸡柳17 小时前
手撕哈希表(Hash Table):从原理到C++完整实现
c++·哈希算法·散列表
charlie11451419118 小时前
通用GUI编程技术——图形渲染实战(三十一)——Direct2D效果与图层:高斯模糊到毛玻璃
c++·图形渲染·gui·win32
音视频牛哥18 小时前
鸿蒙 NEXT RTSP/RTMP 播放器如何回调 RGB 数据并实现 AI 视觉算法分析
人工智能·算法·harmonyos·鸿蒙rtmp播放器·鸿蒙rtsp播放器·鸿蒙next rtsp播放器·鸿蒙next rtmp播放器
飞Link18 小时前
掌控 Agent 的时空法则:LangGraph Checkpoint (检查点) 机制深度实战
开发语言·python·算法