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

选择排序之大根堆

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

灵魂在于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.kler.cn/a/419222.html

相关文章:

  • 【赵渝强老师】PostgreSQL的段、区和块
  • linux常用指令都是工作中遇到的
  • LWIP和FATFS 实现 FTP 服务端
  • Linux---对时/定时服务
  • ARM CCA机密计算安全模型之硬件强制安全
  • ROS2-参数服务器
  • ubuntu20.04更换安装高版本CUDA以及多个CUDA版本管理
  • 【Java基础面试题003】Java的JIT | AOT是什么?
  • 【数据可视化入门】Python散点图全攻略:Matplotlib、Seaborn、Pyecharts实战代码大公开!
  • leetcode 3232. 判断是否可以赢得数字游戏 简单
  • 计算机网络安全 —— 非对称加密算法 RSA 和数字签名
  • springboot363高校竞赛管理系统(论文+源码)_kaic
  • 服务熔断-熔断器设计
  • 【JavaEE】JavaEE、web 开发、框架(Spring) 、Maven
  • SAP-ABAP开发-第二代增强示例
  • Day1——GitHub项目共同开发
  • Vue进阶之单组件开发与组件通信
  • Unity中实现A*寻路算法参考
  • Scala 的知识点
  • Linux中pcap_loop()函数
  • 算法的复杂度
  • LeetCode:19.删除链表倒数第N个节点
  • 解决jupyter notebook 新建或打开.ipynb 报500 : Internal Server Error(涉及jinja2兼容性问题)
  • 蓝桥-希尔排序模板题
  • 【Java基础面试题004】封装、继承、重载、多态、接口和抽象类是什么?
  • 《JavaEat:探索 Java 在美食世界的奇妙之旅》