PriorityQueue的输出因排序和未排序的数组

时间:2018-01-15 19:23:59

标签: arrays priority-queue

我正在实施Priority Queue,但我无法理解为什么outputssorted数组存在不同的unsorted。代码和输出如下所示:

排序数组

import java.io.*;
import java.util.*;
class Test {
    public static void main(String args[] ) throws Exception {
       PriorityQueue<Integer> pq=new PriorityQueue<>();
       int[] a={0,1,2,3,4,5,6,7,8};
       for (int x:a ) {
        pq.add(x);
       }
       Iterator itr=pq.iterator();
       while(itr.hasNext()){
        System.out.print(itr.next()+" ");
       }
       System.out.println();
    }
}
  

输出:0 1 2 3 4 5 6 7 8

未排序的数组

import java.io.*;
import java.util.*;
class Test {
    public static void main(String args[] ) throws Exception {
       PriorityQueue<Integer> pq=new PriorityQueue<>();
       int[] a={4,3,6,2,1,5};
       for (int x:a ) {
        pq.add(x);
       }
       Iterator itr=pq.iterator();
       while(itr.hasNext()){
        System.out.print(itr.next()+" ");
       }
       System.out.println();
    }
}
  

输出:1 2 5 4 3 6

任何人都可以解释一下为什么两种情景的输出之间存在差异?

1 个答案:

答案 0 :(得分:1)

Java中的

PriorityQueue实现为binary heap。二进制堆中项的顺序取决于它们的插入顺序。例如,按顺序插入项目[1,2,3,4]将为您提供堆:

      1
    2   3
  4

但是如果要按顺序[1,3,4,2]插入,那么你的堆就是:

      1
    3   2
  4

请记住,二进制堆不是排序数据结构。它以这样的方式排序:最小项(在最小堆的情况下)总是在根,并且子节点大于它们的父节点。但是对于给定的一组项目,有许多可能的堆排序。

更新

你问,&#34;如何在堆中订购{4,3,6,2,1,5}?&#34;让我们来看看吧。

  • 插入4:{4}
  • 插入3:{3,4}
  • 插入6:{3,4,6}
  • 插入2:2被添加到堆的末尾:{3,4,6,2},然后被筛选。首先,它与其父项交换以生成{3,2,6,4},然后再次与根交换以创建{2,3,6,4}。
  • 插入1:添加到堆{2,3,6,4,1}的末尾。与父{2,1,6,4,3}交换,然后与root交换以创建{1,2,6,4,3}。
  • 插入5:添加到堆{1,2,6,4,3,5}的末尾。与父母交换以创建{1,2,5,4,3,6}。