优先级队列的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;
}
一个不会敲代码的程序员
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述