最大堆和最小堆排序


最大堆和最小堆排序



原理参考趣学数据结构



代码


#include<stdio.h>
#include<stdlib.h>
int r[] = { -1,1,4,590,4,2,8,7,5,89,67,5,2,1,67,86,54 };//存储要排序的数,第一个元素不存储元素赋值为-1
int length = sizeof(r) / sizeof(int);//待排序的数的个数
void swap(int i, int j) {//交换二个变量的值int temp = r[i];r[i] = r[j];r[j] = temp;
}
void sink(int k, int n,int flag) {//flag=0表示最大堆,否则最小堆,实现最大(小)堆,即所有根节点的值大于等于(小于等于)该根节点下的左右节点int j = 0;while (2 * k <= n) {//从倒数第二层有左孩子的结点开始往上检查是否满足每个子树是否满足最大(小)堆的条件j = 2 * k;if (flag == 0) {//最大堆的更新条件if (j<n&&r[j + 1]>r[j])j++;//找到当前根节点下最大的值if (r[k] < r[j])swap(k, j);else//该根节点下已经满足最大堆的条件则退出检查break;}else if(flag==1) {//最小堆的更新条件if (j<n&&r[j + 1]<r[j])j++;//找到当前根节点下最小的值if (r[k] > r[j])swap(k, j);else//该根节点下已经满足最小堆的条件则退出检查break;}k = j;//更新了当前根结点的值则继续向下检查是否满足最大(小)堆的条件
}
}
void print() {for (int i = 1; i<=length-1; i++) {printf("%d ", r[i]);}
}
void heapSort(int n,int flag) {//最大堆或最小堆排序,flag=0表示最大堆排序,否则最小堆排序,这里的最小堆因为没有开辟新的空间所以是逆序的,而最大堆的排序结果是升序的//初始化堆for (int i = n / 2; i > 0; i--) {sink(i, n,flag);}while (n > 1) {print();printf("\n");swap(1, n);//当前第n个元素为第n大(小)元素--n;//选出了最大(小)的元素,则少一个元素sink(1, n, flag);//只改变了根节点的值,只需要对第一个结点进行下沉的更新}
}int main() {printf("初始的顺序\n--------------\n");print();printf("\n最小堆排序后结果\n--------------\n");heapSort(length-1, 1);print();printf("\n--------------\n");printf("初始的顺序\n--------------\n");print();printf("\n最大堆排序后结果\n--------------\n");heapSort(length - 1, 0);print();printf("\n--------------\n");system("pause");return 0;
}

#测试
请添加图片描述


时间复杂度为O(nlogn),


适用场景:topK排序或者需要排序的数据,例如每日的微博点击量TopK排序,尤其在数据量非常大的场景中效果很好!



如果存在不足之处还请批评指正!



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

wordList01

wordList one 如果存在什么问题请批评指正&#xff01;谢谢

《ASP.NET Core 微服务实战》-- 读书笔记(第4章)

第 4 章 后端服务现实中的服务不可能处于真空之中&#xff0c;大多数服务都需要与其他服务通信才能完成功能。我们将这些支持性服务称为后端服务&#xff0c;接下来我们将通过创建一个新的服务并修改之前的团队服务与这个服务通信&#xff0c;以探索如何创建并消费后端服务。微…

WordList02

WordList 2 如果存在什么问题欢迎批评指正&#xff01;谢谢&#xff01;

CentOS7 安装 Jenkins( 构建 Vue 和 dotNET Core )

之前的自动构建工具 Jenkins 是部署在公司内网的 Windows 服务器上&#xff0c;现在武汉处于非常时期&#xff0c;兄弟们都在家自我隔离&#xff0c;为了远程提交的代码能自动构建&#xff0c;需要在外网的 CentOS 服务器上搭建 Jenkins 环境来进行构建工作。目的产品采用前后端…

shell(希尔排序)

shell&#xff08;希尔排序&#xff09; 原理:参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> void shellInsert(int b[],int dk,int length) {//希尔排序以dk的增量插入int j;for (int i 1 dk; i < length-1; i) {b[0] b[i];//哨…

[蓝桥杯2019初赛]等差数列-数列

解题思路: 给你n个数&#xff0c;是某个等差数列的一部分&#xff0c;问该等差数列最小有几项&#xff1f;&#xff1a;((最大数−最小数)/d)1((最大数-最小数)/d)1((最大数−最小数)/d)1,其中d是该等差数列所有&#xff08;所有已知数与最小数差值&#xff09;的最大公因数&am…

Dynatrace成功扩展kubernetes全栈可观察性

软件情报公司Dynatrace&#xff08;NYSE&#xff1a;DT&#xff09;在Perform 2020会议上宣布了对Kubernetes支持的新增强功能。Dynatrace可解释的AI引擎DavisTM现在自动获取其他Kubernetes事件和指标&#xff0c;使其能够在整个Kubernetes集群&#xff0c;容器和工作负载的堆栈…

wordList3

wordList3 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

[蓝桥杯2019初赛]矩形切割-找规律

代码如下&#xff1a; #include <iostream> using namespace std;int main() {int a, b;int ans 1;cin >> a >> b;while (1) {if (a 1 && b 1 || a b)break;if ( a > b) {int c b;b a;a c;}b b - a;ans;}cout << ans << end…

K8S水平伸缩器 - 自动伸缩微服务实例数量

作者&#xff1a;justmine头条号&#xff1a;大数据达摩院微信公众号&#xff1a;大数据处理系统创作不易&#xff0c;在满足创作共用版权协议的基础上可以转载&#xff0c;但请以超链接形式注明出处。为了方便大家阅读&#xff0c;可以关注头条号或微信公众号&#xff0c;后续…

[蓝桥杯2019初赛]质数-质数筛or 水题

法一&#xff1a; 代码如下&#xff1a; #include <iostream> #include <cmath> using namespace std;bool check(int x) {for (int i 2; i < sqrt(x); i)if (x % i 0)return false;return true; }int main() {int n;int ans 0;for (int i 2; i; i) {if (c…

SqlServer 利用游标批量更新数据

SqlServer 利用游标批量更新数据Intro游标在有时候会很有用&#xff0c;在更新一部分不多的数据时&#xff0c;可以很方便的更新数据&#xff0c;不需要再写一个小工具来做了&#xff0c;直接写 SQL 就可以了Sample下面来看一个实际示例&#xff1a;-- 声明字段变量 DECLARE Re…

math:线性代数之行列式

math&#xff1a;线性代数之行列式 提供解题的方法总结 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢!

[蓝桥杯2019初赛]旋转-找规律

代码如下&#xff1a; #include <iostream> using namespace std; const int N 110; int a[N][N];int main() {int n, m;cin >> n >> m;for (int i 1; i < n; i)for (int j 1; j < m; j)cin >> a[i][j];for (int i 1; i < m; i){for (in…

《ASP.NET Core 微服务实战》-- 读书笔记(第5章)

第 5 章 创建数据服务选择一种数据存储由于我坚持要尽可能的跨平台&#xff0c;所以我决定选用 Postgres&#xff0c;而不用 SQL Server 以照顾 Linux 或 Mac 电脑的读者构建 Postgres 仓储在本节&#xff0c;我们要升级位置服务让它使用 Postgres为了完成这一过程&#xff0c;…

腾飞答不忘初心的三个问题

去年的时候有同学在微信上问了我3个问题&#xff0c;我觉得非常有代表性&#xff0c;当时没有回答。主要是通过简短的语言无法全面表述可能会产生歧义&#xff0c;所以决定专门写一篇文章来表达一下我的想法&#xff0c;需要说明的是以下内容只是以我个人的经验给大家一些参考。…

wordList04

wordList04 如果存在什么问题&#xff0c;欢迎批评指正&#xff01;谢谢&#xff01;

用 C# 写一个 Redis 数据同步小工具

用 C# 写一个 Redis 数据同步小工具Intro为了实现 redis 的数据迁移而写的一个小工具&#xff0c;将一个实例中的 redis 数据同步到另外一个实例中。(原本打算找一个已有的工具去做&#xff0c;找了一个 nodejs 的小工具&#xff0c;结果折腾了好久都没装上。。。于是就自己写了…

数据结构----冒泡排序

数据结构----冒泡排序 原理&#xff1a;参考趣学数据结构 代码&#xff1a; #include<stdio.h> #include<stdlib.h> void bubbleSort(int a[], int length) {//冒泡排序for (int i 0; i < length - 1; i) {//趟数for (int j 0; j < length - i - 1; j) {if…

C#如何安全、高效地玩转任何种类的内存之Span的本质(一)。

前言作为.net程序员&#xff0c;使用过指针&#xff0c;写过不安全代码吗&#xff1f;为什么要使用指针&#xff0c;什么时候需要使用它&#xff0c;以及如何安全、高效地使用它&#xff1f;如果能很好地回答这几个问题&#xff0c;那么就能很好地理解今天了主题了。C#构建了一…