Java-堆

优先级队列是一个抽象数据类型(ADT),堆主要用于实现优先级队列。

性质:

1.每个节点都满足其关键字值总是不大于或不小于其父节点的关键字值;

2.通常用数组来实现,表现为完全二叉树,即除了最后一层节点不需要满,其他每一层都是满的。根节点下标为0,最后节点下标为N-1。

3.堆不能有序遍历所有数据,不能找到特定关键字数据项的位置,也不能移除特定关键字的数据项。

4.堆不需要额外的存储空间。它可以用同一个数组来存放初始数据、堆、最后有序的数据。

 

 

弱序:

所有节点的左子孙关键字都小于右子孙的关键字。

移除

一般删除关键字最大的节点,即移走根。

用数组最后一个数据取代它的位置,然后再向下筛选这个节点至适当位置。

插入

在数组最后第一个空着的单元插入,再向上筛选它至合适位置。

向上筛选比向下筛选简单,因为不需要比较两个子节点的关键字大小。它们可看作是一系列交换,更有效的方法是进行一系列的复制。

关键字更改

更改关键字来更改数据项的优先级,然后再把节点向上或向下移动到适当的位置。如果关键字增加了,数据项就向上筛选;若关键字减小了,则向下筛选。

数组的大小

记录堆中节点的数目。注意:从最后一个位置复制的节点并不清除,所以判断最后一个堆占用单元位置的唯一方法就是根据数组当前的大小求得。

扩展堆数组

若插入数据太多,超出数组容量,就创建一新数组,将数据从旧数组复制到新数组中。

堆操作的效率

每种操作均为O(logN)

基于树的堆

堆的实现基于二叉树(不是搜索树),它映射堆的结构:数堆。

代码--显示堆

 public void displayHeap(){
        System.out.print("heapArray:");
        for( int m=0; m<currentSize; m++)
            if(heapArray[m] != null)
                System.out.print( heapArray[m].getKey() + " ");
            else
                System.out.print("-- ");
            System.out.println();

            int nBlanks = 32;
            int itemsPerRow = 1;
            int column = 0;
            int j = 0;
            String dots = ".....................................";
            System.out.println(dots+dots);

            while(currentSize > 0){
                if(column == 0)
                    for(int k=0; k<nBlanks; k++)
                        System.out.print(' ');
                    System.out.print(heapArray[j].getKey());
                    if(++j == currentSize)
                        break;

                    if(++column == itemsPerRow){
                        nBlanks /= 2;
                        itemsPerRow *= 2;
                        column = 0;
                        System.out.println();
                    }
                    else
                        for( int k=0; k<nBlanks*2-2; k++ )
                            System.out.print(' ');
            }
        System.out.println("\n"+dots+dots);
    }

堆排序

优点:节省时间,节省内存。堆对初始数据的分布不敏感,即对任意排序的数据,其效率均为O(N*logN)。

用insert() 插入无序的数据项,然后重复用remove()方法,就可按序移除所有数据项。

堆排序效率:

O(N*logN),包括N次插入,N次移除。

posted @ 2021-04-25 20:44  Xiarsu  阅读(535)  评论(0)    收藏  举报