87 lines
1.8 KiB
Plaintext
87 lines
1.8 KiB
Plaintext
Type Tupla
|
|
Prioridad As Integer
|
|
Tarea As String
|
|
End Type
|
|
Dim Shared As Tupla a()
|
|
Dim Shared As Integer n 'número de eltos. en la matriz, el último elto. es n-1
|
|
|
|
Function Izda(i As Integer) As Integer
|
|
Izda = 2 * i + 1
|
|
End Function
|
|
|
|
Function Dcha(i As Integer) As Integer
|
|
Dcha = 2 * i + 2
|
|
End Function
|
|
|
|
Function Parent(i As Integer) As Integer
|
|
Parent = (i - 1) \ 2
|
|
End Function
|
|
|
|
Sub Intercambio(i As Integer, j As Integer)
|
|
Dim t As Tupla
|
|
t = a(i)
|
|
a(i) = a(j)
|
|
a(j) = t
|
|
End Sub
|
|
|
|
Sub bubbleUp(i As Integer)
|
|
Dim As Integer p = Parent(i)
|
|
Do While i > 0 And a(i).Prioridad < a(p).Prioridad
|
|
Intercambio i, p
|
|
i = p
|
|
p = Parent(i)
|
|
Loop
|
|
End Sub
|
|
|
|
Sub Annadir(fPrioridad As Integer, fTarea As String)
|
|
n += 1
|
|
If n > Ubound(a) Then Redim Preserve a(2 * n)
|
|
a(n - 1).Prioridad = fPrioridad
|
|
a(n - 1).Tarea = fTarea
|
|
bubbleUp (n - 1)
|
|
End Sub
|
|
|
|
Sub trickleDown(i As Integer)
|
|
Dim As Integer j, l, r
|
|
Do
|
|
j = -1
|
|
r = Dcha(i)
|
|
If r < n And a(r).Prioridad < a(i).Prioridad Then
|
|
l = Izda(i)
|
|
If a(l).Prioridad < a(r).Prioridad Then
|
|
j = l
|
|
Else
|
|
j = r
|
|
End If
|
|
Else
|
|
l = Izda(i)
|
|
If l < n And a(l).Prioridad < a(i).Prioridad Then j = l
|
|
End If
|
|
If j >= 0 Then Intercambio i, j
|
|
i = j
|
|
Loop While i >= 0
|
|
End Sub
|
|
|
|
Function Remove() As Tupla
|
|
Dim As Tupla x = a(0)
|
|
a(0) = a(n - 1)
|
|
n = n - 1
|
|
trickleDown 0
|
|
If 3 * n < Ubound(a) Then Redim Preserve a(Ubound(a) \ 2)
|
|
Remove = x
|
|
End Function
|
|
|
|
|
|
Redim a(4)
|
|
Annadir (3, "Clear drains")
|
|
Annadir (4, "Feed cat")
|
|
Annadir (5, "Make tea")
|
|
Annadir (1, "Solve RC tasks")
|
|
Annadir (2, "Tax return")
|
|
Dim t As Tupla
|
|
Do While n > 0
|
|
t = Remove
|
|
Print t.Prioridad; " "; t.Tarea
|
|
Loop
|
|
Sleep
|