Elin Decompiled Documentation EA 23.102 Nightly
Loading...
Searching...
No Matches
PriorityQueueB.cs
Go to the documentation of this file.
1using System.Collections.Generic;
2
3namespace Algorithms;
4
5[Author("Franco, Gustavo")]
6public class PriorityQueueB<T> : IPriorityQueue<T>
7{
8 protected List<T> InnerList = new List<T>();
9
10 protected IComparer<T> mComparer;
11
12 public int Count => InnerList.Count;
13
14 public T this[int index]
15 {
16 get
17 {
18 return InnerList[index];
19 }
20 set
21 {
22 InnerList[index] = value;
23 Update(index);
24 }
25 }
26
28 {
29 mComparer = Comparer<T>.Default;
30 }
31
32 public PriorityQueueB(IComparer<T> comparer)
33 {
34 mComparer = comparer;
35 }
36
37 public PriorityQueueB(IComparer<T> comparer, int capacity)
38 {
39 mComparer = comparer;
40 InnerList.Capacity = capacity;
41 }
42
43 protected void SwitchElements(int i, int j)
44 {
45 T value = InnerList[i];
46 InnerList[i] = InnerList[j];
47 InnerList[j] = value;
48 }
49
50 protected virtual int OnCompare(int i, int j)
51 {
52 return mComparer.Compare(InnerList[i], InnerList[j]);
53 }
54
55 public int Push(T item)
56 {
57 int num = InnerList.Count;
58 InnerList.Add(item);
59 while (num != 0)
60 {
61 int num2 = (num - 1) / 2;
62 if (OnCompare(num, num2) >= 0)
63 {
64 break;
65 }
66 SwitchElements(num, num2);
67 num = num2;
68 }
69 return num;
70 }
71
72 public T Pop()
73 {
74 T result = InnerList[0];
75 int num = 0;
76 InnerList[0] = InnerList[InnerList.Count - 1];
77 InnerList.RemoveAt(InnerList.Count - 1);
78 while (true)
79 {
80 int num2 = num;
81 int num3 = 2 * num + 1;
82 int num4 = 2 * num + 2;
83 if (InnerList.Count > num3 && OnCompare(num, num3) > 0)
84 {
85 num = num3;
86 }
87 if (InnerList.Count > num4 && OnCompare(num, num4) > 0)
88 {
89 num = num4;
90 }
91 if (num == num2)
92 {
93 break;
94 }
95 SwitchElements(num, num2);
96 }
97 return result;
98 }
99
100 public void Update(int i)
101 {
102 int num = i;
103 while (num != 0)
104 {
105 int num2 = (num - 1) / 2;
106 if (OnCompare(num, num2) >= 0)
107 {
108 break;
109 }
110 SwitchElements(num, num2);
111 num = num2;
112 }
113 if (num < i)
114 {
115 return;
116 }
117 while (true)
118 {
119 int num3 = num;
120 int num4 = 2 * num + 1;
121 int num2 = 2 * num + 2;
122 if (InnerList.Count > num4 && OnCompare(num, num4) > 0)
123 {
124 num = num4;
125 }
126 if (InnerList.Count > num2 && OnCompare(num, num2) > 0)
127 {
128 num = num2;
129 }
130 if (num != num3)
131 {
132 SwitchElements(num, num3);
133 continue;
134 }
135 break;
136 }
137 }
138
139 public T Peek()
140 {
141 if (InnerList.Count > 0)
142 {
143 return InnerList[0];
144 }
145 return default(T);
146 }
147
148 public void Clear()
149 {
150 InnerList.Clear();
151 }
152
153 public void RemoveLocation(T item)
154 {
155 int num = -1;
156 for (int i = 0; i < InnerList.Count; i++)
157 {
158 if (mComparer.Compare(InnerList[i], item) == 0)
159 {
160 num = i;
161 }
162 }
163 if (num != -1)
164 {
165 InnerList.RemoveAt(num);
166 }
167 }
168}
PriorityQueueB(IComparer< T > comparer)
void SwitchElements(int i, int j)
PriorityQueueB(IComparer< T > comparer, int capacity)
virtual int OnCompare(int i, int j)