堆--優先佇列
1.完全二叉樹的一個父節點編號為k,那麼他的左二子的編號為2*k,右二子節點的編號為2*k+1
2.如果已知兒子(左兒子或者右兒子)的編號為x,那麼他的父節點的編號為x/2(取整除,就是計算機裡的/)
3.一棵完全二叉樹的高度為logN,即最多有logN層節點
4.最小堆是所有的父節點都比他的子節點小,最大堆是所有的父節點都比他的子節點大
5.像這樣支援插入元素和尋找元素(最大值和最小值)的資料結構成為優先佇列,如果使用普通佇列,那麼尋找最大元素就需要列舉整個佇列,時間複雜度為O(n),時間複雜度比較高,如果是已經排好序的陣列,那麼插入一個元素需要移動大量的資料,時間複雜度依舊很高,而堆就是一種優先佇列的實現,可以很好地解決這兩種操作
6.堆經常被用來求一個數列中第K大的數,只需要建立一個大小為K的最小堆,堆頂就是第K大的數(舉個例子,假設有事十個數,要求第3大的數,將前三個數建成最小堆,然後從第四個數開始,與堆頂元素比較,如果比堆頂元素大,則捨棄當前堆頂元素,而將這個新數作為堆頂,然後堆頂開始向下調整,如果比堆頂元素小,則不進入堆),同理如果求第K小的數,那麼就建一個最大堆,這種方法的時間複雜度為O(NlogK)
<span style="font-size:18px;">//該演算法用來把數從小到大排序
#include<iostream>
#include<queue>
#include<stack>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#define maxn 20
#define inf 0x3f3f3f3f
using namespace std;
int h[maxn];//用來存放堆的陣列
int n;//用來儲存堆中元素的個數,也就是堆的大小
//交換堆中兩個元素的位置
void swap(int i, int j)
{
int t=h[i];
h[i]=h[j];
h[j]=t;
return;
}
void siftdown(int i)//從i開始向下調整
{
int t,flag=1;
while(i*2<=n && flag)//至少存在左兒子
{
if(h[i*2]>h[i])
t=i*2;
else t=i;
if(i*2+1<=n)//如果存在右兒子
{
if(h[i*2+1]>h[t])
t=i*2+1;
}
if(i!=t)//說明父節點不是最小的點
{
swap(i,t);//交換父節點和比父節點大的子節點的位置
i=t;//更新為剛才交換的子節點的編號,方便繼續向下調整
}
else
flag=0;
}
return;
}
void creat()
{
for(int i=n/2;i>=1;i--)//從最後一個父節點開始向下調整
siftdown(i);
}
void heapsort()
{
while(n>1)
{
swap(1,n);
n--;
siftdown(1);
}
return;
}
int main()
{
int num;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&h[i]);
num=n;
creat();//建堆
heapsort();//堆排序
printf("\n");
for(int i=1;i<=num;i++)
printf("%d ",h[i]);
printf("\n");
return 0;
}
/*
輸入資料
14
99 5 36 7 22 17 46 12 2 19 25 28 1 92
輸出結果
1 2 5 7 12 17 19 22 25 28 36 46 92 99
*/</span>
相關文章
- 堆與優先佇列佇列
- 堆和優先佇列佇列
- 二叉堆優先佇列佇列
- 堆——神奇的優先佇列(上)佇列
- 二叉堆實現優先佇列佇列
- 手擼優先佇列——二叉堆佇列
- 堆和堆的應用:堆排序和優先佇列排序佇列
- 堆、堆排序和優先佇列的那些事排序佇列
- 最詳細版圖解優先佇列(堆)圖解佇列
- 優先佇列的一種實現方式—堆佇列
- 【資料結構】回顧優先佇列(堆)資料結構佇列
- java使用PriorityQueue即優先佇列實現大根堆和小根堆Java佇列
- 【堆】【優先佇列】[NOIP2004]合併果子佇列
- PHP優先佇列PHP佇列
- 優先佇列 (轉)佇列
- 8.13(優先佇列貪心維護+打表找規律+對頂堆優先佇列+DFS減枝+貪心dp)佇列
- 淺談優先佇列佇列
- STL 優先佇列 用法佇列
- 優先佇列和堆排序佇列排序
- 堆排序與優先佇列排序佇列
- Java優先佇列(PriorityQueue)示例Java佇列
- 『演算法與資料結構』優先佇列 二叉堆演算法資料結構佇列
- 01揹包優先佇列優化佇列優化
- java資料結構基礎-利用Heap(堆)實現PriorityQueue(優先佇列)Java資料結構佇列
- 棧,佇列,優先順序佇列簡單介面使用佇列
- Redis實現任務佇列、優先順序佇列Redis佇列
- NO GAME NO LIFE(優先佇列/最小堆)GAM佇列
- 優先佇列的比較器佇列
- 封裝優先順序佇列封裝佇列
- POJ 3253 Fence Repair 優先佇列AI佇列
- 優先佇列的效能測試佇列
- hdu5040 優先佇列+bfs佇列
- 佇列 優先順序佇列 python 程式碼實現佇列Python
- 牛客網 複數集合(小根堆的優先佇列、北郵機試)佇列
- 演算法面試(三) 優先佇列演算法面試佇列
- STL優先佇列最小堆最大堆佇列
- STL醜數(set+優先佇列)佇列
- 【圖論】拓撲排序+優先佇列圖論排序佇列