`
iluoxuan
  • 浏览: 580065 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

5:大顶堆: 最大优先队列

 
阅读更多

1:  与前面说的最小优先队列相反

 

 堆的排序也相反 : 

 

package com.algorithm.common;

import java.util.Iterator;
import java.util.NoSuchElementException;

/**
 * 大顶堆排序 最大优先队列
 * @author lijunqing
 */
public class MaxPQ<Key> implements Iterable<Key> {

    private int N;

    private Key[] pq;

    public MaxPQ() {
        this(1);
        N=0;
    }

    public MaxPQ(int initCapacity) {
        pq=(Key[])new Object[initCapacity + 1];
        N=0;
    }

    /**
     * 添加一个到堆中
     * @param key
     */
    public void insert(Key key) {
        if(N == pq.length - 1) { // 申请2培空间
            resize(2 * pq.length);
        }
        N++;
        pq[N]=key;
        swim(N);
    }

    /**
     * 递归调整当前节点和父节点的
     * @param n2
     */
    private void swim(int i) {
        while(i > 1 && greater(i, i / 2)) {
            exch(i, i / 2);
            i=i / 2;
        }
    }

    /**
     * 堆顶出堆 重新调整堆
     * @return
     */
    public Key delMax() {
        exch(1, N);
        Key max=pq[N];
        pq[N]=null;
        N--;
        skin(1);
        return max;
    }

    /**
     * 从i节点开始调整堆
     * @param i
     */
    private void skin(int i) {
        while(2 * i <= N) {
            int k=2 * i;
            if(k < N && greater(k+1, k)) {
                k++;
            }
            if(greater(i, k)){
                break;
            }
            exch(i, k);
            i=k;
        }
    }

    /**
     * i节点大于j节点
     * @param i
     * @param i2
     * @return
     */
    private boolean greater(int i, int j) {
        return ((Comparable<Key>)pq[i]).compareTo(pq[j]) > 0;
    }

    /**
     * 重新申请空间
     * @param capacity
     */
    private void resize(int capacity) {
        Key[] temp=(Key[])new Object[capacity];
        for(int i=0; i < pq.length; i++) {
            temp[i]=pq[i];
        }
        pq=temp;
    }

    /**
     * 交互节点值
     * @param i
     * @param j
     */
    private void exch(int i, int j) {
        Key temp=pq[i];
        pq[i]=pq[j];
        pq[j]=temp;
    }

    public int size() {
        return N;
    }

    public boolean isEmpty() {
        return N == 0;
    }

    @Override
    public Iterator<Key> iterator() {
        return new HeapIterator();
    }

    private class HeapIterator implements Iterator<Key> {

        // 重新建一个
        private MaxPQ<Key> copy;

        public HeapIterator() {
            copy=new MaxPQ<Key>(size());
            for(int i=1; i <= N; i++)
                copy.insert(pq[i]);
        }

        public boolean hasNext() {
            return !copy.isEmpty();
        }

        public void remove() {
            throw new UnsupportedOperationException();
        }

        public Key next() {
            if(!hasNext())
                throw new NoSuchElementException();
            return copy.delMax();
        }
    }

    public static void main(String[] agrs) {
        MaxPQ<Integer> max=new MaxPQ<Integer>();
        max.insert(22);
        max.insert(1);
        max.insert(56);
        max.insert(41);
        max.insert(3);
        max.insert(27);
        Iterator<Integer> m = max.iterator();
        while(m.hasNext()){
            System.out.println(m.next());
        }
    }

}

 

结果:

56
41
27
22
3
1

 

  

分享到:
评论

相关推荐

    优先队列代码堆实现

    本程序通过堆来实现优先队列,堆是一种二叉树形结构,满足堆属性:父节点的值总是大于或等于(最小堆)或小于或等于(最大堆)其子节点的值。这种特性使得堆在查找最大或最小元素时非常高效,时间复杂度为O(1)。 在...

    采用堆写的优先队列_源代码

    本篇文章将深入分析如何使用大顶堆来实现一个支持搜索最大优先权值、插入元素值以及删除最大优先权值操作的优先队列。 #### 二、大顶堆简介 大顶堆是一种特殊的完全二叉树结构,其中每个节点的值都大于或等于其子...

    优先队列(Priority Queue)是一种特殊类型的队列

    堆是一种完全二叉树,满足堆性质:父节点的键值总是大于或等于(最小优先队列)或小于或等于(最大优先队列)其子节点的键值。这样可以确保根节点始终是最小或最大元素,从而方便快速地执行Extract-Min或Extract-Max...

    优先队列 优先队列.rar

    在C++标准库中,优先队列(priority_queue)是通过STL(Standard Template Library)提供的,它底层基于大顶堆实现。用户可以使用`&lt;queue&gt;`头文件中的`priority_queue`模板类来创建和操作优先队列。以下是一些基本...

    堆排序及优先队列源代码_上机c++ 添加元素 删除最大节点

    大顶堆或小顶堆都可以作为优先队列的基础结构。当需要删除最高优先级的元素时,只需删除堆顶元素即可。同时,向优先队列中添加新元素可以通过向堆中插入元素来实现。 #### 五、C++代码分析 在给定的C++代码中,...

    大顶堆应用:POJ2010

    大顶堆是一种特殊的完全二叉树,其每个节点的值都大于或等于其子节点的值,常用于实现优先队列,快速找到最大元素,或者进行高效的排序算法,如堆排序。 在编程竞赛中,大顶堆经常被用来解决时间复杂度要求较高的...

    山东大学软件学院数据结构课设-应用堆实现一个优先队列,并实现作业的优先调度

    堆是一种特殊的树形数据结构,通常以数组的形式存储,满足以下两个性质之一:大顶堆或小顶堆。在大顶堆中,每个节点的值都大于或等于其子节点的值;而在小顶堆中,则是小于或等于。堆通常用于实现优先队列,因为它们...

    优先队列-双端堆

    查询最大优先队列的元素,和最小优先队列的元素,时间复杂度为o(1) 因为数组的第一个元素便是我们所需要得要的元素。 而插入操作,只要判断应该插入那棵树,也将是O(1),然而之后需要调整,此时的时间...

    c++链表队列的实现

    根据给定文件的信息,我们可以...综上所述,虽然给定的代码并非链表队列的实现,但它为我们提供了对优先队列的理解,特别是基于数组实现的大顶堆。希望这些内容能够帮助理解链表队列的基本概念及其在C++中的实现方式。

    算法-树形结构- 优先队列.rar

    7. **C++中的优先队列**:在C++中,`&lt;queue&gt;`库提供了`priority_queue`模板类,它是一个大顶堆实现的优先队列,可以通过自定义比较函数进行定制。 这个压缩包中的“树形结构-优先队列.pdf”文件可能详细介绍了这些...

    大(小)顶堆练习:POJ 1442

    在计算机科学中,大顶堆和小顶堆是两种特殊的二叉堆,它们分别保证了根节点是其子树中最大或最小的元素,常用于实现优先队列。 大顶堆通常用于快速找到当前最大元素,例如在求解最大值问题或执行堆排序时。小顶堆则...

    c++优先队列(priority_queue)用法详解

    以下是一个使用基本类型的优先队列示例,创建了两个队列,一个默认的大顶堆,一个自定义的小顶堆: ```cpp #include #include int main() { priority_queue&lt;int&gt; a; // 大顶堆 priority_queue, vector, ...

    手撸一个优先队列(csdn)————程序.pdf

    优先队列是一种特殊的队列,它的特点在于元素不是按照先进先出(FIFO)的原则进行操作,而是根据优先级进行排序。在Java中,`java.util.PriorityQueue`是内置的优先队列实现,但这里我们将探讨如何手动实现一个简单...

    leetcode295数据流的中位数_优先队列,简单很多。python 代码+思路

    优先队列做了一个动态的变化: 如果总个数为偶数,那么插入新元素经历 最大堆 → 最小堆 → 最大堆 如果总个数为奇数,那么插入新元素经历 最大堆 → 最小堆 即可 总之保证 最大堆比最小堆个数相等或者多一个 别人的...

    一次测试,快速队列大小根堆

    标题中的“快速队列大小根堆”是一种高效的数据结构,常用于实现优先队列。它结合了堆(Heap)和队列(Queue)的特点,能够快速地插入元素、删除最大或最小元素。在C++中,这样的数据结构可以通过自定义容器或者使用...

    实验报告 - 堆 .docx

    堆是一种特殊的树形数据结构,通常用于优先队列的实现,分为大顶堆和小顶堆,其中大顶堆的根节点总是最大元素,而小顶堆的根节点是最小元素。 实验报告中提到了以下基本操作: 1. **InitHeap(Heap &H, int size, ...

    堆排序,构建最优队列

    堆排序是一种基于比较的排序算法...`Heap.java`文件可能是实现堆排序或优先队列的一个Java源代码文件,可能包含了上述讨论的堆构造、插入、删除等相关方法。你可以通过阅读和理解这个文件来深入学习堆排序的实现细节。

    堆排序_排序_

    在堆中,我们有两种主要类型:大顶堆和小顶堆。大顶堆规定每个节点的值都大于或等于其子节点的值;小顶堆则相反,每个节点的值都小于或等于其子节点的值。 2. **构建堆**:堆排序首先将待排序的元素构造成一个大...

    数据结构之堆 → 不要局限于堆排序.doc

    堆可以分为两种类型:大顶堆和小顶堆。在大顶堆中,每个父节点的值都大于等于其子节点的值,反之在小顶堆中,父节点的值小于等于子节点的值。这种属性使得大顶堆的根节点总是存储最大值,小顶堆的根节点则是最小值。...

Global site tag (gtag.js) - Google Analytics