堆、堆排序
创始人
2025-05-30 19:23:05

堆的基本操作操作:

        1、插入一个数:

                数组末尾插入一个元素,并up()操作维护一下堆

                heap[ ++ size] = x; up(size);

        2、求集合当中的最小值:

                        小根堆的堆顶元素

                        heap[1]

        3、删除最小值:

                        使用最后一个节点的值覆盖第一个节点的值,再把数组的下标--,再使用头节点down(1)运算维护一下堆。

                        heap[1] = heap[size]; size --; down(1);

        4、删除任意一个元素(STL里面的堆无法进行的操作):

                        分情况判断,变大了或者变小了。

                        heap[k] = heap[size]; size -- ; down(k)或者up(k)

        5、修改任意一个元素(STL里面的堆无法进行的操作)

                        heap[k] = x; down(k);或者 up(k);

堆的基本结构:

        1、是一个平衡二叉树(即树除了最后一层节点可以不满以外,其它层的节点都是非空的,且最后一层节点是从左往右排列的)

        2、小根堆:根节点的值小于左右子节点的值,所以根节点是最小值

堆的存储:

        x的左二子是:2*x;x的右二子是:2*x+1;

        注:下标从1开始比较好

堆的基本操作(时间复杂度为O(nlogn)):

        down(x):x往下移动;当某个数变大的时候可以使用down操作        

                              令根节点和根节点、左、右子节点中的最小值进行交换,重复此操作

        up(x):x往上移动;当某个数变小的时候可以使用up操作

                        令数值较小节点和根节点、左、右子节点中的最小值进行交换,重复此操作   

例题及模板代码:

堆排序(down()函数的使用)

题目内容

输入一个长度为n的整数数列,从小到大输出前m小的数。 输入格式

第一行包含整数n和m。

第二行包含n个整数,表示整数数列。

输出格式

共一行,包含m个整数,表示整数数列中前m小的数。

数据范围

1≤m≤n≤10^5 , 1≤数列中元素≤10^9

输入样例:

5 3
4 5 1 3 2
输出样例:

1 2 3

#include 
#include 
using namespace std;
const int N = 100010;
int n,m;
int h[N],size;
void down(int u) {int t = u;//使用t记录根节点的值//让根节点分别和左右子节点进行对比if(u*2<=size&&h[u*2]

 

相关内容

热门资讯

昊海生科拟受让瑞济生物19.8... 北京商报讯(记者 丁宁)12月12日晚间,昊海生科(688366)发布公告称,公司拟以自有资金383...
原创 飞... 散瓶批发参考价跌至1485元/瓶,原箱产品报价1495元,较年初价格累计跌幅超30%,曾经一瓶难求的...
王源北京跨晚活动展现独特氛围 近日,王源在北京举办的跨晚活动引发了广泛关注,现场氛围热烈,吸引了众多粉丝的参与。活动于2025年举...
2025年度《财经》长青企业案... “2026《财经》可持续发展论坛暨长青企业案例发布仪式”即将启幕,敬请期待。 2025年,是“十四五...
迎接飞机“退役潮” 资环绿投与... 天津北方网讯:日前,中国资环旗下资环绿投国际公司与中飞航空后市场控股有限公司(简称“中飞后市场”)正...