只有我知道,将要升起的星辰,千年前|

小坦js

园龄:2年8个月粉丝:17关注:9

📂C++
2022-08-31 22:31阅读: 156评论: 0推荐: 0

堆和堆排序

堆的定义:

1. 堆是一棵完全二叉树。

2. 大根堆:

  堆的每一个子树的父亲永远大于其左孩子和右孩子,如下图:

  

3.小根堆:

  堆的每一个子树的父亲永远小于于其左孩子和右孩子。

堆的性质:

1. 小根堆的堆顶永远存放着最小值,大根堆的堆顶永远存放着最大值

2. 堆的每一上的数不一定比下一全部要小或大。

3. 因为是一颗完全二叉树,所以用数组存储即可,父节点下标为i,则left_child=i*2, right_child=i*2+1.

 

堆的操作:

建立一个小根堆:

在堆尾加入元素(当前结点)并比较它与父节点的大小,若大于则结束,否则交换他们的值并把父节点置为当前节点,向上调整。

代码:

int heap[100000000];
void put(int x){
	int pa,son;
	heap[++heap_size]=x;
	son=heap_size;
	while(son>1){
		pa=(son/2);
		if(heap[pa]<=heap[son]) break;
		swap(heap[pa],heap[son]);
		son=pa;
	}
}

建立一个大根堆:

只需要改动一个地方(第8 行):

if(heap[pa]<=heap[son]) break;

改为:

if(heap[pa]>=heap[son]) break; 

 

取出一个(堆顶)元素(这里以小根堆为例):

1.取出堆顶值。

2.把堆的最后一个元素放到堆顶上,并把堆的长度减一。

3.从上到下动态调整,每一次取左右子节点中较大的进行交换,并将当前指针指向下一个(被交换的)位置。

代码如下:

int get(){//获得堆顶元素
	int now,next;
	int res;
	res=heap[1];//获取堆顶元素
	heap[1]=heap[heap_size--];//将堆底最后一个元素放到堆顶;
	now=1;
	while(now*2<=heap_size){//保证now不在最后一层(否则next会超出范围)
		next=now*2;//先选左节点
		if(next<heap_size&&heap[next+1]<heap[next]) next++;//判断是选择左结点还是右结点,若执行了则选了右结点(别忘了在保证不超堆的范围内)
		if(heap[now]<=heap[next]) return res;//如果放上去的无需调整则直接结束
		swap(heap[now],heap[next]);
		now=next; 
	}
	return res;
}

 

堆排序:

输入n个数,将n个数从小到大输出:

解析:

  建立一个小根堆,然后每次取出堆顶即可,这就是堆排序。

代码1:

#include<iostream>
using namespace std;
int heap[100000000];

int heap_size=0;
//建堆(小根堆)
void put(int x){
	int pa,son;
	heap[++heap_size]=x;
	son=heap_size;
	while(son>1){
		pa=(son/2);
		if(heap[pa]<=heap[son]) break;
		swap(heap[pa],heap[son]);
		son=pa;
	}
}

int get(){//通过获得堆顶元素(最小值)来实现从小到大排序
	int now,next;
	int res;
	res=heap[1];//获取堆顶元素
	heap[1]=heap[heap_size--];//将堆底最后一个元素放到堆顶;
	now=1;
	while(now*2<=heap_size){//保证now不在最后一层(否则next会超出范围)
		next=now*2;//先选左节点
		if(next<heap_size&&heap[next+1]<heap[next]) next++;//判断是选择左结点还是右结点
		if(heap[now]<=heap[next]) return res;
		swap(heap[now],heap[next]);
		now=next; 
	}
	return res;
}

int main(){
	int n,x;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x;
		put(x);
	}
	for(int i=1;i<=n;i++){
		cout<<get()<<' ';
	}
	cout<<endl;
	return 0;
}

小结:

堆排序效率较高,时间复杂度为:O(nlog2n),是一种不稳定的排序方法。

优先队列:

有关优先队列的相关介绍请参考:https://www.cnblogs.com/xiaotan-js/p/16644818.html

一般来说,没人会手写堆和堆排序,以上就是关于堆这一数据结构的介绍,而真正使用堆,大部分人都会选择STL中的优先队列:

代码2:

#include<queue>
#include<iostream>
using namespace std;
priority_queue<int,vector<int>,greater<int> > q;
int n,x;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x;
		q.push(x);
	}
	for(int i=1;i<=n;i++){
		cout<<q.top()<<' ';
		q.pop();
	}
	return 0;
}

是不是简洁很多?

本文作者:小坦js

本文链接:https://www.cnblogs.com/xiaotan-js/p/16644776.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   小坦js  阅读(156)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 让风告诉你 花玲,喵☆酱,宴宁,kinsen
  2. 2 Rex Incognito 尘世闲游 陈致逸,HOYO-MiX
  3. 3 君がいる世界へ 鹿乃
  4. 4 Lemon 米津玄师
  5. 5 打上花火 DAOKO,米津玄师
  6. 6 ちいさな冒険者 雨宮天,高橋李依,茅野愛衣
  7. 7 おうちに帰りたい 雨宮天,高橋李依,茅野愛衣
  8. 8 ひまわりの約束 高橋李依
  9. 9 キセキ 高橋李依
  10. 10 高橋李依
  11. 11 Stay Alive 高橋李依
  12. 12 Believe in you nonoc
  13. 13 101匹目の羊 雨宮天,高橋李依,茅野愛衣
  14. 14 Wishing 水瀬いのり
  15. 15 動く、動く 水瀬いのり
  16. 16 夜に駆ける YOASOBI
  17. 17 群青 YOASOBI
  18. 18 優しい彗星 YOASOBI
  19. 19 もしも命が描けたら YOASOBI
  20. 20 アンコール YOASOBI
  21. 21 あの夢をなぞって YOASOBI
  22. 22 灰色と青 米津玄師,菅田将晖
  23. 23 砂の惑星 米津玄師,初音ミク
  24. 24 Flamingo 米津玄師
  25. 25 海の幽霊 米津玄師
  26. 26 紅蓮華(多多poi版!!) 多多poi
  27. 27 心做し(原唱版) 一之瀬ユウ,GUMI
  28. 28 sweets parade 花澤香菜
  29. 29 恋愛サーキュレーション(恋爱循环) 花澤香菜
  30. 30 はじめましての気持ちを Daoko,神山羊
  31. 31 つくりましょう! 金田朋子,松岡由貴,樋口智恵子
  32. 32 彼女は旅に出る 鎖那
  33. 33 ひとり旅 (feat. 鎖那) 瀬名航,鎖那
  34. 34 ハロ/ハワユ 鹿乃
  35. 35 心拍数#0822 鹿乃
  36. 36 KING kanaria,GUMI
  37. 37 Daydream cafe Petit Rabbit's
  38. 38 Adrenaline!!! (TV Ver) TrySail
  39. 39 ヒトリゴト (TV Size) Claris
  40. 40 ヒトリゴト(完整版) Claris
  41. 41 千本桜 初音ミク
  42. 42 大喜 泠鸢yousa,音阙诗听
  43. 43 勾指起誓 泠鸢yousa
  44. 44 还是你的笑容最可爱 音阙诗听,泠鸢yousa,王梓钰
  45. 45 与你有关 泠鸢yousa
  46. 46 吉祥話 Hanser,泠鸢yousa,祖娅纳惜,鹿乃
  47. 47 神のまにまに 初音ミク,鏡音リン,GUMI,れるりり
  48. 48 気ままな天使たち わたてん☆5
  49. 49 DEAREST DROP 田所あずさ
  50. 50 フロム (TV size) TRUE
  51. 51 恋のうた (feat. 由崎司) Yunomi,鬼頭明里
  52. 52 INSIDE IDENTITY Black Raison d'être
  53. 53 summertime cinnamons,evening cinema
Rex Incognito 尘世闲游 - 陈致逸,HOYO-MiX
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

Not available