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

时间:2022-09-27 10:13:42

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