zoukankan      html  css  js  c++  java
  • 二叉堆实现优先队列

      优先队列是一种特殊的队列,并不是按照“先进先出”的规则进出队列。

      相对于普通的队列,优先队列的不同之处在于“优先”二字。优先队列中的元素拥有不同的优先级,进入队列的元素都按照

    某一个性质进行排序,出队时选择优先级最高的元素。

      二叉堆:父节点的值总大于(小于)任一子节点的值。所以,最大值或者最小值总在根节点,可以在常数时间内取得。把最大

    、最小值映射到优先队列中的优先级,就可以用二叉堆来实现优先队列。

      二叉堆是一棵完全二叉树,如果用数组来存放二叉堆的元素,那么当父节点为 i 时,左儿子节点是2i,右儿子节点是2i+1。

    基于这一特性,可以直接用数组来存放二叉堆的元素。

      

     1 class priorityQueue
     2 {
     3     int size;
     4     int length;
     5     int *vec;
     6 
     7     public :
     8         priorityQueue(const int size):size(size),length(1)
     9         {
    10             vec = new int[size];
    11         };
    12         ~priorityQueue()
    13         {
    14         }
    15         void enqueue( int data );
    16         void dequeue();
    17         void print()
    18         {
    19             int i = length-1;
    20             while( i>=1 )
    21             {
    22                 cout << vec[i] << " ";
    23                 i--;
    24             }
    25             cout << endl;
    26         }
    27 };
    28 
    29 void priorityQueue::enqueue( int data )
    30 {
    31     if( length<size )
    32     {
    33         int hole = length;
    34         int parent = (hole)/2;
    35         while( parent>0 && vec[parent]>data )
    36         {
    37             vec[hole] = vec[parent];
    38             hole = parent;
    39             parent = (hole)/2;
    40         }
    41         vec[hole] = data;
    42         length++;
    43     }
    44     else
    45     {
    46         cout << "队列满" << endl;
    47     }
    48 }
    49 
    50 void priorityQueue::dequeue()
    51 {
    52     if( length>1 )
    53     {
    54         int hole = 1;
    55         int child = 2*hole;
    56         int data = vec[--length];
    57         while( child<=length )
    58         {
    59             if( child+1<=length )
    60             {
    61                 child = vec[child]<vec[child+1] ? child : child+1;
    62             }
    63             
    64             vec[hole] = vec[child];
    65             hole = child;
    66             child = 2*hole;
    67         }        
    68         vec[hole] = data;
    69     }
    70     else
    71     {
    72         cout << "队列空" << endl;
    73     }
    74 }
    生活不止眼前的苟且 还有诗和远方的田野
  • 相关阅读:
    1月6日 作业 穷举
    1.4 作业
    12月31日 作业
    12月29日-练习成果
    12月30日作业-<转>字符集编码
    1.22作业
    集合
    泛型
    CPU接口练习 (仅以此程序证明 某个同学真的有毒!有毒!!!)
    继承知识点总结
  • 原文地址:https://www.cnblogs.com/jc-nogame/p/5953658.html
Copyright © 2011-2022 走看看