【算法】堆排序

算法-堆排序


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

思路

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

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

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

练习
相关推荐
lul~8 分钟前
[科研理论]无人机底层控制算法PID、LQR、MPC解析
c++·人工智能·无人机
liulilittle11 分钟前
OpenSSL 的 AES-NI 支持机制
linux·运维·服务器·算法·加密·openssl·解密
yzx99101322 分钟前
柑橘检测模型
服务器·人工智能·深度学习·算法
南枝异客24 分钟前
电话号码的字母组合
开发语言·javascript·算法
快乐肚皮40 分钟前
快速排序:分治思想的经典实践
java·算法·排序算法
我命由我123451 小时前
STM32 开发 - 中断案例(中断概述、STM32 的中断、NVIC 嵌套向量中断控制器、外部中断配置寄存器组、EXTI 外部中断控制器、实例实操)
c语言·开发语言·c++·stm32·单片机·嵌入式硬件·嵌入式
CodeWithMe2 小时前
【软件开发】上位机 & 下位机概念
c++
luofeiju2 小时前
数字图像处理与OpenCV初探
c++·图像处理·python·opencv·计算机视觉
whoarethenext2 小时前
使用 C/C++的OpenCV 将多张图片合成为视频
c语言·c++·opencv
weixin_428498492 小时前
Catch2 开源库介绍与使用指南
c++