【算法】堆排序

算法-堆排序


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

思路

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

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

这里有一个序列,要对它升序排序
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);
    }
}

练习
相关推荐
这料鬼有毒12 分钟前
二刷hot100-1143.最长公共子序列
算法·leetcode·动态规划
政企项目老覃1 小时前
边缘 AI 推理部署:安防零售场景下的模型裁剪与端侧落地实践
人工智能·程序人生·算法·性能优化·vllm
I_belong_to_jesus1 小时前
std::unique_ptr成员函数用法
c++
Tairitsu_H2 小时前
[C++] 拷贝构造还是赋值重载?类默认成员函数细节详解
开发语言·c++·类和对象
GreenTea3 小时前
发布 3 天登顶 HN:不生成一个字的模型 Jev,我把它的源码和黑料都扒了一遍
前端·后端·算法
汉克老师3 小时前
GESP2026年9月认证C++四级( 第一部分选择题(1~7题)精讲
c++·gesp·小学生·学c++编程
geats人山人海3 小时前
现代c++第二章 字符串
c++
庖丁解牛3 小时前
无穷小不是一个“神秘小数”,而是一场奔向 0 的过程
算法
idealzouhu3 小时前
现代 CMake 依赖管理详解:从构建树、Target 封装到 find_package 工作原理
c++·cmake
ZPC82104 小时前
YOLO26 识别串番茄果梗
人工智能·深度学习·算法·机器学习