优先级队列

原创 2015年07月09日 16:15:37

今天做题,发现需要用到优先级队列,于是看了一下优先级队列。优先级队列是管理一组数的数据结构,优先级队列分为最大优先级队列和最小优先级队列。其结构相当于最大堆和最小堆,最大(最小)的元素位于堆顶,每个子树的跟大于(小于)其左右子树。

用C++实现最大堆和最小堆的一些操作如下:

最大堆:

struct max_heap{
    int num[M],size;

    int geiSize(){
        return size;
    }

    void siftup(int size){
        int j=size;
        int middle=(j-1)/2;
        int temp=num[j];
        while(j>0){
            if(temp<=num[middle])
                break;
            else{
                num[j]=num[middle];
                j=middle;
                middle=(middle-1)/2;
            }
        }
        num[j]=temp;
    }

    void siftdown(int start,int end){
        int j=start;
        int middle=2*j+1;
        int temp=num[j];
        while(middle<=end){
            if(middle<end&&num[middle]<num[middle+1])
                ++middle;
            if(temp>=num[middle])
                break;
            else{
                num[j]=num[middle];
                j=middle;
                middle=2*middle+1;
            }
        }
        num[j]=temp;
    }

    void insert(int x){
        num[size]=x;
        siftup(size);
        size++;
    }

    void del(){
        num[0]=num[size-1];
        size--;
        siftdown(0,size-1);
    }
}
最小堆

struct min_heap{
    int num[M],size;

    void siftup(int start){
       int j=start;
       int middle=(j-1)/2;
       int temp=num[j];
       while(j>0){
            if(temp>=num[middle])
                break;
            else{
                num[j]=num[middle];
                j=middle;
                middle=(middle-1)/2;
            }
       }
       num[j]=temp;
    }

    void siftdown(int start,int end){
        int j=start;
        int middle=2*j+1;
        int temp=num[j];
        while(middle<=end){
            if(middle<end&&num[middle]>num[middle+1])
                ++middle;
            if(temp>num[middle]){
                num[j]=num[middle];
                j=middle;
                middle=2*middle+1;
            }
            else
                break;
        }
        num[j]=temp;
    }

    void insert(int x){
        num[size]=x;
        siftup(size);
        size++;
    }

    void del(){
       num[0]=num[size-1];
       size--;
       siftdown(0,size-1);
    }

    int getSize(){
        return size;
    }
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

优先级队列是一种什么样的数据结构

优先级队列(PriprityQueue)是一种无界队列,基于优先级堆,它的元素根据自然顺序或者通过实现Comparator接口的自定义排序方式进行排序。这篇文章,我们将创建一个Items的优先级队列,...
  • chuntiandejiaobu10
  • chuntiandejiaobu10
  • 2016年09月07日 20:52
  • 758

优先级队列几个应用详解

优先级队列区别于普通队列的一点是:优先级队列如果插入的节点是结构体类型,则要在结构体中重载比较操作符函数。示例代码如下: //优先级队列的使用测试 //优先级队列跟对列的使用方式的区别是优先级队...
  • liuzhanchen1987
  • liuzhanchen1987
  • 2012年08月12日 13:52
  • 7391

一个作业调度程序,采用的链式优先级队列

                      以前编的一个使用链式优先级队列的作业调度程序,也是比较简单的。#includeiostream>#includeassert.h>using namespa...
  • lsk_30516
  • lsk_30516
  • 2006年12月19日 09:23
  • 1486

用java实现优先级别队列

1、注意:因优先级别最高的元素被删除后,其后边的数都会往前移动,所以不会出现“假溢出”。所以不用设计成循环队列2、包和类的结构截图:3package com.test3;public class El...
  • liangyihuai
  • liangyihuai
  • 2015年09月15日 13:45
  • 396

第十章·优先级队列

需求与动机什么是优先级队列 优先队列是计算机科学中的一类抽象数据类型。优先队列中的每个元素都有各自的优先级,优先级最高的元素最先得到服务;优先级相同的元素按照其在优先队列中的顺序得到服务。优先队列...
  • xiang_freedom
  • xiang_freedom
  • 2016年04月22日 00:53
  • 4144

JDK中优先级队列PriorityQueue实现分析

Java优先级队列PriorityQueue我们知道,堆可以实现优先级队列。 优先级队列可以实现以下功能: 插入一个数值 取出最小的数值(获得数值,并且删除) 我们来看看JDK源码中的Prior...
  • xiangshimoni
  • xiangshimoni
  • 2015年04月21日 22:54
  • 1193

【STL学习】优先级队列Priority Queue详解与C++编程实现

优先级队列Priority Queue介绍 优先级队列是一个拥有权值观念的queue。它允许在底端添加元素、在顶端去除元素、删除元素。 优先级队列内部的元素并不是按照添加的顺序排列,而是自...
  • xiajun07061225
  • xiajun07061225
  • 2013年01月30日 16:43
  • 14123

java中关于优先级队列的实现

       这几天一直在搞关于优先级队列的实现,因为要考虑到线程的安全,所以PriorityQueue就不适用了。一个非常简单的实现方法,那就是把优先级比较好的插入一个队列,优先级低的插入...
  • kjfcpua
  • kjfcpua
  • 2009年11月30日 11:36
  • 2338

C语言实现优先级队列——priqueue

C语言实现优先级队列在回顾一个学长的项目时,发现他在串口的多线程操作时不是单纯的使用互斥量在读写操作时来共享串口,而是使用了一个优先级队列,在共享串口的基础上,可以设定读或写命令的优先级来决定命令执行...
  • u011192270
  • u011192270
  • 2015年10月22日 00:45
  • 1430

Cloud Design Pattern - Priority Queue Pattern(优先级队列模式)

1.前言 上一篇我们讨论了云计算设计模式之管道和过滤器模式 了解了如何使用消息队列来协调多任务系统的执行。这一篇,我们继续深入讨论消息队列的使用,即消息队列中的消息是带有优先级别的,优先级别高的先处理...
  • afandaafandaafanda
  • afandaafandaafanda
  • 2015年11月13日 14:27
  • 693
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:优先级队列
举报原因:
原因补充:

(最多只允许输入30个字)