• 优先级队列的Java ,C++ STL,堆实现


    0  整理自网络

    1. Java版(转) 要比较的对象必须实现Comparable接口,重写compareTo 方法,Java在红自带有优先级队列的实现PriorityQueue

    Queue<ToDoItem> q = new PriorityQueue<ToDoItem>();

    import java.util.Collections;
    import java.util.PriorityQueue;
    import java.util.Queue;


    public class ToDoItem implements Comparable<ToDoItem>{
    private char primary;
    private int secondary;
    private String item;

    public ToDoItem(char primary,int secondary,String item)
    {
    super();
    this.primary = primary;
    this.secondary = secondary;
    this.item = item;
    }

    @Override
    public int compareTo(ToDoItem o) {
    // TODO Auto-generated method stub

    if(this.primary > o.primary)
    return 1;
    if(this.primary == o.primary)
    {
    if(this.secondary > o.secondary)
    return 1;
    else if(this.secondary == o.secondary)
    return 0;
    }
    return -1;
    }

    public String toString() {
    return Character.toString(primary) + this.secondary + " : " + this.item;
    }

    public static void main(String [] args)
    {
    Queue
    <ToDoItem> q = new PriorityQueue<ToDoItem>();
    q.add(
    new ToDoItem('C', 4, "Empty trash"));
    q.add(
    new ToDoItem('A', 2, "Feed dog"));
    q.add(
    new ToDoItem('B', 7, "Feed bird"));
    q.add(
    new ToDoItem('C', 3, "Mow lawn"));
    q.add(
    new ToDoItem('A', 1, "Water lawn"));
    q.add(
    new ToDoItem('B', 1, "Feed cat"));

    while (!q.isEmpty()) {
    System.out.println(q.remove());
    }

    Queue
    <ToDoItem> q1 = new PriorityQueue<ToDoItem>(1,
    Collections.reverseOrder());
    q1.add(
    new ToDoItem('C', 4, "Empty trash"));
    q1.add(
    new ToDoItem('A', 2, "Feed dog"));
    q1.add(
    new ToDoItem('B', 7, "Feed bird"));
    q1.add(
    new ToDoItem('C', 3, "Mow lawn"));
    q1.add(
    new ToDoItem('A', 1, "Water lawn"));
    q1.add(
    new ToDoItem('B', 1, "Feed cat"));

    while (!q1.isEmpty()) {
    System.out.println(q1.remove());
    }

    }



    }

      2.  C++ STL 版 

    STL中也有自带的priority_queue 而且可以有2种比较的方式,greater和less

         priority_queue<node,vector<node>,greater<node> > queue1;
    priority_queue
    <node,vector<node>, less<node> > queue2;
         其中比较可以通过operator还重载
         friend bool operator > (const node &a,const node &b)
    {
    return (a.z > b.z);
    }
    friend
    bool operator < (const node &a,const node &b)
    {
    return (a.z < b.z);
    }
    #include <iostream>
    #include
    <vector>
    #include
    <queue>
    using namespace std;
    struct node
    {
    int x;
    int y;
    int z;
    friend
    bool operator > (const node &a,const node &b)
    {
    return (a.z > b.z);
    }
    friend
    bool operator < (const node &a,const node &b)
    {
    return (a.z < b.z);
    }
    };



    int main()
    {
    priority_queue
    <node,vector<node>,greater<node> > queue1;
    priority_queue
    <node,vector<node>, less<node> > queue2;
    node n[
    10];
    for(int i = 0;i < 10;i ++)
    {
    n[i].x
    = i;
    n[i].y
    = 10 - i;
    n[i].z
    = i;
    queue1.push(n[i]);
    queue2.push(n[i]);
    }

    while(!queue1.empty())
    {
    cout
    << queue1.top().x << " " << queue1.top().y <<" " << queue1.top().z << endl;
    queue1.pop();
    }
    cout
    << endl;

    while(!queue2.empty())
    {
    cout
    << queue2.top().x << " " << queue2.top().y << " " << queue2.top().z << endl;
    queue2.pop();
    }
    cout
    << endl;

    return 0;
    }

      还可以通过 自定义函数法,是一个 仿函数

    #include <iostream>
    #include
    <queue>
    #include
    <vector>
    #include
    <functional>
    using namespace std;
    struct node
    {
    int x;
    int y;
    int z;
    };

    struct node_greater_cmp
    {
    bool operator()(const node & a,const node & b)
    {
    return a.z>b.z;
    }
    };

    struct node_less_cmp
    {
    bool operator()(const node &a,const node &b)
    {
    return a.z < b.z;
    }
    };


    int main()
    {
    priority_queue
    <node,vector<node>,node_greater_cmp > queue1;
    priority_queue
    <node,vector<node>,node_less_cmp > queue2;
    node n[
    5];

    for(int i = 0;i < 5; i ++)
    {
    n[i].x
    = i;
    n[i].y
    = 5 - i;
    n[i].z
    = i;
    queue1.push(n[i]);
    queue2.push(n[i]);
    }

    while(!queue1.empty())
    {
    cout
    << queue1.top().x << " " << queue1.top().y <<" " << queue1.top().z << endl;
    queue1.pop();
    }
    cout
    << endl;

    while(!queue2.empty())
    {
    cout
    << queue2.top().x << " " << queue2.top().y << " " << queue2.top().z << endl;
    queue2.pop();
    }
    cout
    << endl;


    return 0;
    }

      3. 自己实现,以建堆的方式实现优先级队列

    #include <iostream>

    using namespace std;
    const int INF = 999999;
    //堆调整
    void maxHeapify(int *a, int i, int len)
    {
    int lt = 2*i, rt = 2*i+1;
    int largest;
    if(lt <= len && a[lt] > a[i])
    largest
    = lt;
    else
    largest
    = i;
    if(rt <= len && a[rt] > a[largest])
    largest
    = rt;
    if(largest != i)
    {
    int temp = a[i];
    a[i]
    = a[largest];
    a[largest]
    = temp;
    maxHeapify(a, largest, len);
    }
    }
    //建最大堆
    void buildMaxHeap(int *a,int size)
    {
    for(int i = size / 2;i >= 1;i --)
    maxHeapify(a,i,size);
    }
    void print(int *a,int size)
    {
    for(int i = 1;i <= size; i ++)
    cout
    << a[i] << " ";
    cout
    << endl;
    }

    int heapMaximum(int *a)
    {
    return a[1];
    }
    //提取并返回具有最大关键字的元素
    int heapExtractMax(int *a,int &heapsize)
    {
    if(heapsize < 1)
    cout
    << "heap underflow !" << endl;

    int max = a[1];

    a[
    1] = a[heapsize];
    -- heapsize;

    maxHeapify(a,
    1,heapsize);
    return max;
    }
    //将a[i]增加到key,模拟优先级的提高
    void heapIncreaseKey(int *a,int i,int key)
    {
    if(key < a[i])
    cout
    << "new key is less than current key ! " << endl;
    a[i]
    = key;
    while(i > 1 && a[i/2] < a[i])
    {
    int temp = a[i];
    a[i]
    = a[i/2];
    a[i
    /2] = temp;
    i
    /= 2;
    }

    }
    //插入关键字为key 的元素
    void insert(int *a,int key,int &heapsize)
    {
    ++heapsize;
    a[heapsize]
    = -INF;
    heapIncreaseKey(a,heapsize,key);
    }


    int main()
    {
    int len,heapsize;
    int a[100] = {0, 15, 13, 9, 5, 12, 8, 7, 4, 0, 6, 2, 1};
    len
    = heapsize = 12;

    buildMaxHeap(a,len);
    cout
    << "建堆后:" << endl;
    print(a,heapsize);

    cout
    << "当前最大的元素:" << endl;
    cout
    << heapMaximum(a) << endl;

    cout
    << "使用heapextractmax后:" << endl;
    int maxx = heapExtractMax(a,heapsize);

    print(a,heapsize);

    cout
    << "再次使用heapextractmax后:" << endl;
    heapExtractMax(a,heapsize);
    print(a,heapsize);

    cout
    << "使用heapIncreaceKey后:" << endl;
    heapIncreaseKey(a,
    2,15);
    print(a,heapsize);

    cout
    << "使用insert插入28后:" << endl;
    insert(a,
    28,heapsize);
    print(a,heapsize);


    cout
    << "使用insert插入100后:" << endl;
    insert(a,
    100,heapsize);
    print(a,heapsize);

    return 0;
    }

      

  • 相关阅读:
    android 6.0 新特性
    接口_ _接口回调机制
    bug_ _
    volley_缓存介绍
    bug__android studio 出现布局文件不提示,且点击代码不能跟踪代码
    文章--笔记本蓝牙可以搜索到手机,但是怎么连接不了?
    Dialog_ _dialog系统样式讲解 及 透明背景
    动画_ _ Android应用开发之所有动画使用详解
    view坐标_ _ Android应用坐标系统全面详解
    html__脚本之家
  • 原文地址:https://www.cnblogs.com/hitwtx/p/2152497.html
Copyright © 2020-2023  润新知