其实根据已经看到的伪代码来说,感觉它的计算方式还是很简单的,主要还是基于原有二叉堆的实现算法上进行一定程度的改造,一个是入队算法,就是指添加一个元素到原有数组之中,该数组本来已经实现了二叉堆,一开始先将添加的元素放置在数组最尾部,也就是二叉堆的最后一个三角节点处,开始进行上级父节点的比较,不断的比较最终确定其位置。另一个是出队算法,这个就比较简单了,跟前面的堆排序其实差不多,就是每次提取出整个二叉堆的根(可能是最大值或者是最小值)。
算法伪代码:
ENQUEUE(Q,e) //入队
1. if heap-size[Q] > length[Q]
2. then error" 堆上溢"
3. i<-heap-size[Q]<-heap-size[Q]+1
4. A[heap-size[Q]]<-e
5. while i>1 and A[PARENT(i)]<A[i]
6. do exchange A[i] <->A[PARENT(I)]
7. i <- PARENT(I)
DEQUEUE(Q)
1. if heap-size[Q] <1
2. then error "堆上溢"
3. max<-Q[l] //这里Q[l]是指原二叉堆的根(可能是最大值或是最小值)
4. Q[l] <-Q[heap-size[Q]]
5. heap-size[Q] <-heap-size[Q]-1
6. MAX-HEAPIFY(Q,1)
7. return max
C++:
main.cpp
#include <iostream>
#include<algorithm>
#include<iterator>
#include<functional>
#include<vector>
#include<queue>
using namespace std;
int main(){
int a[]={5,1,9,4,6,2,0,3,8,7},i;
string b[]={"ChongQing","ShangHai","AoMen","TianJin","BeiJing","XiangGang"};
double c[]={8.5,6.3,1.7,9.2,0.5,2.3,4.1,7.4,5.9,3.7};
priority_queue<int,vector<int>,less<int>> p;//这部分就是定义了一个能实现二叉堆优先出入队的变量p,大值提取到父节点
for(i=0;i<10;i++)
p.push(a[i]);//这部分就是入队,每次入队都会进行一次堆实现
while(!p.empty()){ //只要变量p不为空,循环就会一直进行下去
cout<<p.top()<<" "; //将该堆的根输出
p.pop(); //将除去堆根之后的数据再推入变量p中进行堆实现
}
cout<<endl;
priority_queue<double,vector<double>,greater<double>> p1;//这部分就是定义了一个能实现二叉堆优先出入队的变量p,小值提取到父节点(这里调用的是STL中的优先出入队)
for(i=0;i<10;i++)
p1.push(c[i]);
while(!p1.empty()){
cout<<p1.top()<<" ";
p1.pop();
}
cout<<endl;
}
JAVA:
Test.java
package test;
import java.util.*;
public class Test{
public static void main(String[] args){
Integer a[]={5,1,9,4,6,2,0,3,8,7},i;
PriorityQueue q=new PriorityQueue (10,new Less());//这里利用了java中Collection Framework中的模板,其中less表示提取最大值到父节点
PriorityQueue q1=new PriorityQueue();//默认的话就是将最小值提取到父节点
for(i=0;i<10;i++) {
q.add(a[i]);//进行入队
q1.add(a[i]);
}
while(!q.isEmpty())//只要数组不为空
System.out.print(q.poll()+" ");//进行出队
System.out.println();
while(!q1.isEmpty())
System.out.print(q1.poll()+" ");
System.out.println();
}
}