我知道最小堆是类使用的结构,因为它的效率很高。在我看来,当将未排序的数据提供给PQ时,会将其分类为堆。优先级队列中的排序与未排序数据为什么自动排序和排序等待?
但是当按照compareTo方法提供元素时,它会在PQ上执行第一个操作后等待将其排序到堆中。
你知道这是为什么吗?我不明白为什么它不像无序数据那样自动排序。
我附上了一个程序,我认为证明了我的问题。
输出:
未排序的数据:
[A,B,d,C,L,F,E,J]
甲
[B,C, d,J,L,F,E]
[1,2,4,3,12,6,5,10]
[2,3,4,10,12,6,5]
排序的数据:
[A,B,C,d,E,F,G ,H]
甲
[B,d,C,H,E,F,G]
[1,2,3,4,5,6,7,8]
[2,4,3,8,5,6,7]
import java.util.PriorityQueue;
public class Queue2
{
public static void main(String[] args)
{
PriorityQueue<String> pQueue = new PriorityQueue<String>();
pQueue.add("A");
pQueue.add("C");
pQueue.add("F");
pQueue.add("B");
pQueue.add("L");
pQueue.add("D");
pQueue.add("E");
pQueue.add("J");
System.out.println(pQueue);
System.out.println(pQueue.remove());
System.out.println(pQueue);
System.out.println();
PriorityQueue<Integer> pQueue2 = new PriorityQueue<Integer>();
pQueue2.add(1);
pQueue2.add(3);
pQueue2.add(6);
pQueue2.add(2);
pQueue2.add(12);
pQueue2.add(4);
pQueue2.add(5);
pQueue2.add(10);
System.out.println(pQueue2);
System.out.println(pQueue2.remove());
System.out.println(pQueue2);
System.out.println();
PriorityQueue<String> pQueue3 = new PriorityQueue<String>();
pQueue3.add("A");
pQueue3.add("B");
pQueue3.add("C");
pQueue3.add("D");
pQueue3.add("E");
pQueue3.add("F");
pQueue3.add("G");
pQueue3.add("H");
System.out.println(pQueue3);
System.out.println(pQueue3.remove());
System.out.println(pQueue3);
System.out.println();
PriorityQueue<Integer> pQueue4 = new PriorityQueue<Integer>();
pQueue4.add(1);
pQueue4.add(2);
pQueue4.add(3);
pQueue4.add(4);
pQueue4.add(5);
pQueue4.add(6);
pQueue4.add(7);
pQueue4.add(8);
System.out.println(pQueue4);
System.out.println(pQueue4.remove());
System.out.println(pQueue4);
}
}
所以我认为你说的是有序的信息符合形状和堆属性,因此是一个min二进制堆,不需要改变。只有当物品被移除时才会更改。而无序数据需要在堆被更改之前排入堆中。因此,我的问题将是一个糟糕的问题,因为排序后的数据堆积如山。 – user2428874
@ user2428874好吧,我不认为这是一个坏问题,但其余的就是这样。你打印的是底层数组,它确实代表了二进制最小堆。 –
感谢您的帮助。我觉得有点傻,但你的解释确实有帮助。我无法提前建立连接。再次感谢! – user2428874