当前位置: 首页 > news >正文

选择排序之大根堆

大根堆:树的根节点大于左右子树的结点值,这样就能保证每次从树根取的是最大值

灵魂在于HeadAdjust函数,以某节点为树根通过下落调整为大根堆,

建树思想 就是,从最后一个非终端结点开始调整以该结点为根的子树, 通过HeadAdjusth函数下落实现

排序:因为树根是最大值,每次取数根,然后与树最后一个结点交换,然后将这个点固定,树的结点数减一,调整根节点这棵树重新变为大根堆,重复依次。

#include <bits/stdc++.h> 
using namespace std;
#define inf 0x3f3f3f
void swap(int &a, int &b){int tmp=a;a=b;b=tmp;
}
//子树头节点的下落 
void HeadAdjust(int a[], int k, int len){a[0]=a[k];//暂存子树头结点//一直下落,找到最终位置 for(int i=k*2; i<=len; i*=2){if(i<len && a[i+1]>a[i])i++;//从左右儿子中找到一个最大儿子 if(a[0]>=a[i])break;//找到了最终下落位置 else{//孩子比他大,就下落 a[k]=a[i];k=i;}}a[k]=a[0];//给找到的结点写回值 
}
void BuildMaxHeap(int a[], int len){//a数组从1开始存//从最后一个非终端结点开始调整,下落; for(int i=len/2; i>=1; i--){HeadAdjust(a, i, len);}
}
void HeadSort(int a[], int len){BuildMaxHeap(a, len);//建大根堆 //每次将数跟也就是最大元素与最后一个元素交换,//再调整大根堆,每次就能确定一个未确定的最大数 for(int i=len; i>1; i--){swap(a[i], a[1]);//把最大的结点1放到树末 HeadAdjust(a, 1, i-1);//每次确定一个最大数,未确定数就少一个 } 
} 
int main()
{int a[100];int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}HeadSort(a, n);for(int i=1;i<=n;i++)cout<<a[i]<<endl;return 0;
}

http://www.lryc.cn/news/495791.html

相关文章:

  • AI的魔力:如何为开源软件注入智慧,开启无限可能
  • 如何在 VPS 上使用 Git 设置自动部署
  • Linux下的三种 IO 复用
  • 通过 SSH 进行WordPress网站的高级服务器管理
  • 速盾高防cdn支持移动端独立缓存
  • PMP–一、二、三模、冲刺–分类–8.质量管理
  • 如何快速使用Unity 的UPR---1资源检测保姆级
  • pytorch中的.clone() 和 .detach()
  • 三十二:网络爬虫的工作原理与应对方式
  • nodejs相关知识介绍
  • MySQL排它锁
  • HarmonyOS4+NEXT星河版入门与项目实战(22)------动画(属性动画与显示动画)
  • Vue3 Ts 如何获取组件的类型
  • RAG数据拆分之PDF
  • 【算法day1】数组:双指针算法
  • Ubuntu 22.04 离线安装软件包
  • 网络安全——浅谈HTTP协议
  • 鸿蒙开发-在ArkTS中制作音乐播放器
  • Rust学习笔记_03——元组
  • LabVIEW内燃机气道试验台测控系统
  • git 本地同步远端分支
  • 用Pycharm安装manim
  • #渗透测试#红蓝攻防#HW#漏洞挖掘#漏洞复现01-笑脸漏洞(vsftpd)
  • vue3项目中使用星火API
  • digit_eye开发记录(3): C语言读取MNIST数据集
  • 【linux】(23)对象存储服务-MinIo
  • 如何使用Python解析从淘宝API接口获取到的JSON数据?
  • C# 2024年Visual Studio实用插件集合
  • Matlab Simulink HDL Coder开发流程(一)— 创建HDL兼容的Simulink模型
  • 详解Qt pdf 之QPdfSelection 选择文本类