8.基于二叉堆的优先队列算法

其实根据已经看到的伪代码来说,感觉它的计算方式还是很简单的,主要还是基于原有二叉堆的实现算法上进行一定程度的改造,一个是入队算法,就是指添加一个元素到原有数组之中,该数组本来已经实现了二叉堆,一开始先将添加的元素放置在数组最尾部,也就是二叉堆的最后一个三角节点处,开始进行上级父节点的比较,不断的比较最终确定其位置。另一个是出队算法,这个就比较简单了,跟前面的堆排序其实差不多,就是每次提取出整个二叉堆的根(可能是最大值或者是最小值)。

算法伪代码:

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();
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_39653545/article/details/82856258