您的位置:首页 > 编程语言 > C语言/C++

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

2011-08-24 20:06 513 查看
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;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: