java - Java PriorityQueue 如何对元素进行排序
问题描述
我正在使用优先级队列编写一个简单的程序,我在其中添加元素,我不知道它是如何在内部对元素进行排序的(java doc 说它是基于自然排序顺序但如何?)。
Java代码:
PriorityQueue pQueue = new PriorityQueue();
// Adding items to the pQueue using add()
pQueue.add(10);
pQueue.add(20);
pQueue.add(15);
pQueue.add(50);
pQueue.add(3);
pQueue.add(2);
输出为:[2, 10, 3, 50, 20, 15]
解决方案
你做对了,但部分是因为你错过了它的第一部分。
基于优先级堆的无界优先级队列。优先级队列的元素根据它们的自然顺序或在队列构造时提供的 Comparator 进行排序,具体取决于使用的构造函数。
如您所见,它明确提到它基于优先级堆。现在,如果您想了解什么是堆,可以参考Binary Heap,或者如果您想了解基本上有 3 种堆类型 -> Min & Map,可以参考一行。Java 的优先级队列使用最小堆,在这种情况下
在二叉堆中存在的所有键中,根的键必须是最小的,并且对于同一棵树中的所有节点,相同的属性必须递归地为真
要实现这个java,还需要使用位移:
private static <T> void siftUpComparable(int k, T x, Object[] es) {
Comparable key;
int parent;
for(key = (Comparable)x; k > 0; k = parent) {
parent = k - 1 >>> 1;
Object e = es[parent];
if (key.compareTo(e) >= 0) {
break;
}
es[k] = e;
}
es[k] = key;
}
推荐阅读
- python - 如何从熊猫字符串列中正确提取数字符号
- django - 随机数据库与 AWS 中的 Django 和 Postgresql 断开连接
- typescript - 在 TypeScript 中声明数组类型的最佳方法?
- javascript - 从查询字符串中删除关联数组
- java - 在骆驼中找到错误的路线
- visual-studio-code - 使用 WSL 在 VS 代码中禁用 Git 扩展
- javascript - 如何为也可以包含视频的 wordpress 帖子制作滑块?
- esbuild - esbuild:如何使用 `loader: { '.css': 'text' }` 结合 `minify: true` 将缩小的 CSS 作为嵌入文本?
- c# - 在 EF Core 中为一对一关系定义具有特定列名的实体
- jquery - jQuery日期选择器没有输出