数据结构--优先队列(堆排序)

数据结构--优先队列(堆排序)

优先队列:不是先进先出啦,下面的代码是大顶堆,大的先出。

在之前理解堆排序的基础上,在来理解优先队列。

还是用这个公式:

  leftNo = parentNo*2+1

  rightNo = parentNo*2+2

  parentNo = (nodeNo-1)/2

每次进队列是从最后进,在慢慢上浮。

每次出队列,堆顶先出,在把队尾调到堆顶,在下浮。

上代码

package sy181002;

import java.util.Arrays;

/**
 * 优先队列
 *
 */
public class PriorityQueue
{
    private int[] array;
    //size是指向下一次插入的位置,就是元素个数
    private int size;
    public PriorityQueue()
    {
        array=new int[32];
    }

    /**
     * 入队 从最后插入 所以上浮
     * @param key 入队元素
     */
    public void enQueue(int key)
    {
        //队列长度超出范围,扩容
        if(size>=array.length)
            resize();
        array[size++]=key;
        upAdjust();
    }

    /**
     * 出队  第一个删除,把最后一个元素顶替到第一个
     */
    public int deQueue() throws Exception
    {
        if(size<=0)
            throw new Exception("队列空了");
        //获取堆顶元素
        int head=array[0];
        //最后一个元素移动到堆顶
        array[0]=array[--size];
        downAdjust();
        return head;
    }

    /**
     * 上浮调整
     * 从最后插入元素,所以其要一直上浮到比其父节点小为止
     * c=2p+1
     */
    public void upAdjust()
    {
        int child=size-1;
        int parent=child-1;
        int temp=array[child];
        while(child>0 && temp>array[parent])
        {
            array[child]=array[parent];
            child=parent;
            parent=(child-1)/2;
        }
        array[child]=temp;
    }
    /**
     * 下沉调整
     * 最大值出队列,让最后一个值到队首,一直调整下去
     * 保证左右孩子中右节点最大
     * 当父节点比孩子节点小时,父节点交换
     */
    public void downAdjust ()
    {
        int parent=0;
        int child=1;
        int temp=array[parent];
        while(child<size)
        {
            if(child+1<size && array[child+1]>array[child])
            {
                child++;
            }
            if(temp>=array[child])
                break;
            array[parent]=array[child];
            parent=child;
            child=(2*child)+1;
        }
        array[parent]=temp;

    }
    public void resize()
    {
        int newSize=this.size*2;
        this.array=Arrays.copyOf(this.array, newSize);

    }

    public void show()
    {
        for (int i : array)
        {
            System.out.print(i+"  ");
        }
    }

}

测试类

package sy181002;

public class PriheapTest
{

    public static void main(String[] args) throws Exception
    {
        PriorityQueue priorityQueue = new PriorityQueue();
        priorityQueue.enQueue(3);
        priorityQueue.enQueue(7);
        priorityQueue.enQueue(3);
        priorityQueue.enQueue(1);
        priorityQueue.enQueue(44);
        priorityQueue.enQueue(41);

        priorityQueue.show();
        System.out.println();
        System.out.println("出队"+priorityQueue.deQueue());
        priorityQueue.show();
        System.out.println();
        System.out.println("出队"+priorityQueue.deQueue());
        priorityQueue.show();
        System.out.println();
        System.out.println("出队"+priorityQueue.deQueue());
        priorityQueue.show();
        System.out.println();
        System.out.println("出队"+priorityQueue.deQueue());
        priorityQueue.show();
        System.out.println();
        System.out.println("出队"+priorityQueue.deQueue());
        priorityQueue.show();

        System.out.println();

    }

}

结果

原文地址:https://www.cnblogs.com/symkmk123/p/9739524.html

时间: 2024-11-15 16:51:49

数据结构--优先队列(堆排序)的相关文章

数据结构之堆排序

堆排序,是数据结构中重要的排序方法,可以很快帮你找到最大值.在实际应用中,如 最大优先级队列是大顶推的应用,可以很快找到优先级最高的队列. 1.堆概念 堆的定义如下,n个元素的序列{k1,k2,...kn},当且仅当满足如下关系: ki>=k2i               或者         ki<=k2i ki>=k2i+1                          ki<=k2i+1 分别对应大顶堆和小顶堆. 堆可以看作一个完全二叉树,所有非终端点都大于或都小于左右

数据结构:堆排序

「仅为草稿,尚未详解」 堆排序(C语言版) 走进堆排序 什么是堆 堆实质就是一颗完全二叉树,其任何一非叶子节点满足下列性质. i=1,2,3...n/2 说明: 既然是完全二叉树,我们就可以用数组来表示! 堆根据上面的性质又分为: 从中不难发现,大顶堆从上往下依次键值减小,小顶堆从上向下键值增大. 什么是堆排序 ? 对一组待排序记录的关键字,首先把它们按堆的定义建成小(大)顶堆 ? 然后输出堆顶的最小(大)关键字所代表的记录,再对剩余的关键字建堆,以便得到次小(大)的关键字 ? 如此反复进行,直

数据结构_堆排序介绍

原文作者:http://www.cnblogs.com/skywang12345/p/3602162.html.在他基础上修改了一点 堆排序介绍 堆排序(Heap Sort)是指利用堆这种数据结构所设计的一种排序算法.因此,学习堆排序之前,有必要了解堆!若读者不熟悉堆,建议先了解堆(建议可以通过二叉堆,左倾堆,斜堆,二项堆或斐波那契堆等文章进行了解),然后再来学习本章. 我们知道,堆分为"最大堆"和"最小堆".最大堆通常被用来进行"升序"排序,而

JAVA数据结构--优先队列(堆实现)

优先队列(堆)的定义 堆(英语:Heap)是计算机科学中一类特殊的数据结构的统称.堆通常是一个可以被看做一棵树的数组对象.在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权.堆即为解决此类问题设计的一种数据结构. 我个人比较通俗的理解就是比如我们平常下载视频看,我们打算下载两部视频,一部2G,一部只有200M.优先队列的思想就是先下载那部体积较小的视频,这样也比较合理,可以下完200M后

2269: minval(优先队列 堆排序)

2269: minval 时间限制: 3 Sec  内存限制: 256 MB提交: 638  解决: 65[提交][状态][讨论版][命题人:外部导入] 题目描述 有两个长度为N的序列A和B,在A和B中各任取一个数相加可以得到N2个和,求这N2个和中最小的N个. 输入 第一行输入一个正整数N(1<=N<=100000): 第二行N个整数Ai且Ai<=109:第三行N个整数Bi且Bi<=109. 输出 输出仅一行,包含n个整数,从小到大输出这n个最小的和,相邻数字之间用空格隔开. 样

数据结构排序-堆排序

堆排序就是利用了最大堆(或最小堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字变得简单.以最大堆为例,它的基本思想就是: 先将初始文件R[1..n]建成一个最大堆,此堆为初始的无序区: 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key: 由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆.然后再次

c语言数据结构之 堆排序

算法:先生成随机数,赋值到数组,将数组第一个元素a[0]设置为哨兵,函数调用数组和随机数个数n,再设定n/2的根结点与孩子结点进行比较操作,若右孩子存在,则选出三个数里最小的数赋值给根节点,如果右孩子不存在,则只需比较左孩子与根节点大小,一直循环操作至a[1],再从a[2]开始进行根结点与孩子结点进行比较操作,一直到n/2为止,最后,依次输出a[1],输出后将a[n]赋值给a[1]:再进行递归操作,重复以上步骤,直至数组为空 要点:画出二叉树是方便理解,并非数据的结构就是如同二叉树那般存储,存储

javascript数据结构-优先队列

这里之所以扩充一个 有限队列 是因为,生活使用中队列通常会附加优先级,比如排队买票,一般老人和军人等会有优先权限. 实现:继承上篇的 普通队列实现.这里用一种方法,入队的时候,进行排序插入到指定位置,输出不变. 优先队列类 //继承自 Queue function PriorityQueue(){ Queue.call(this); } 继承原型方法 function base(p, c){ var h = {}, P = p.prototype, C = c.prototype; for(va

数据结构----------------优先队列

优先队列 主要用于:1.插入 2.删除最大元素 基于实现这两项功能,用二叉堆来实现, 分析: ____________MaxPQ<Key>implementsIterator<Key>_______________________ insert() delMax()    优先队列的2个主要功能 ----------------------------------------------------------------------------------------------