zoukankan      html  css  js  c++  java
  • 算法:优先级队列(PriorityQueue)

    背景

    此文给出基于已排序数组的实现,多数情况应该基于 Heap 进行实现,因为数组的插入效率为O(n),而 Heap 的插入效率为 Log(n)。

    PriorityQueue

    代码

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Linq;
      4 using System.Text;
      5 using System.Threading.Tasks;
      6 
      7 namespace DataStuctureStudy.Queues
      8 {
      9     public class PriorityQueue<T>
     10         where T : IComparable<T>
     11     {
     12         private readonly int _maxSize;
     13         private readonly T[] _items;
     14         private int _count = 0;
     15         private int _head = -1;
     16 
     17         public PriorityQueue(int size)
     18         {
     19             _maxSize = size;
     20             _items = new T[size];
     21         }
     22 
     23         public void EnQueue(T item)
     24         {
     25             if (this.IsFull())
     26             {
     27                 throw new InvalidOperationException("队列已满");
     28             }
     29 
     30             if (_count == 0)
     31             {
     32                 _items[++_head] = item;
     33             }
     34             else
     35             {
     36                 _items[++_head] = item;
     37                 for (var i = _head; i >= 1; i++)
     38                 {
     39                     if (_items[i].CompareTo(item) < 0)
     40                     {
     41                         Swap(_items, i - 1, i);
     42                     }
     43                     else
     44                     {
     45                         break;
     46                     }
     47                 }
     48             }
     49 
     50             _count++;
     51         }
     52 
     53         public T DeQueue()
     54         {
     55             if (this.IsEmpty())
     56             {
     57                 throw new InvalidOperationException("队列已空");
     58             }
     59 
     60             T item = _items[_head--];
     61 
     62             _count--;
     63 
     64             return item;
     65         }
     66 
     67         public T Peek()
     68         {
     69             if (this.IsEmpty())
     70             {
     71                 throw new InvalidOperationException("队列已空");
     72             }
     73 
     74             return _items[_head];
     75         }
     76 
     77         public bool IsFull()
     78         {
     79             return _count == _maxSize;
     80         }
     81 
     82         public bool IsEmpty()
     83         {
     84             return _count == 0;
     85         }
     86 
     87         public int Size()
     88         {
     89             return _count;
     90         }
     91 
     92         private static void Swap(T[] items, int left, int right)
     93         {
     94             if (left != right)
     95             {
     96                 var temp = items[left];
     97                 items[left] = items[right];
     98                 items[right] = temp;
     99             }
    100         }
    101     }
    102 }
  • 相关阅读:
    毕业设计-1.11
    毕业设计-1.10
    毕业设计-1.09
    毕业设计-1.08
    毕业设计-1.07
    [工具]Maven的安装和配置【MyEclipse】
    毕业设计-1.06
    tomcat部署项目时省略项目名
    Jenkins实现iOS项目自动化打包(含踩坑记录)
    钉钉小程序封装网络请求
  • 原文地址:https://www.cnblogs.com/happyframework/p/3482633.html
Copyright © 2011-2022 走看看