
Code: Alles auswählen
EnableExplicit
Macro ArraySize(a)
(PeekL(@a - 8))
EndMacro
Procedure downHeap(a.l(1), n.l, v.l)
Protected w.l = 2 * v + 1 ; 1. Nachfolger von v
While w < n
If w + 1 < n
; es existiert ein 2. Nachfolger
If a(w + 1) > a(w)
w + 1
EndIf
EndIf
; w ist der grösste Nachfolger
If a(v) >= a(w)
; v hat Heap-Eigenschaft (v ist am grössten des Triples)
ProcedureReturn 0
EndIf
; v ist nicht am grössten ->
; wechsle Position von v und grösstem Nachfolger
Swap a(v), a(w)
; korrigiere auch die weiteren Nachfolger
v = w
w = 2 * v + 1
Wend
EndProcedure
Procedure buildHeap(a.l(1), n.l)
Protected v.l
For v = n / 2 - 1 To 0 Step -1
downHeap(a(), n, v)
Next
EndProcedure
Procedure heapSort(a.l(1), n.l)
buildHeap(a(), n)
While n > 1
n - 1
Swap a(0), a(n)
downHeap(a(), n, 0)
Wend
EndProcedure
Procedure sort(a0.l(1))
Protected n.l = ArraySize(a0())
heapSort(a0(), n)
EndProcedure
;- Test
#N = 50
Dim a.l(#N)
Define z.l
For z = 0 To #N
a(z) = Random(100)
Next
sort(a())
For z = 0 To #N
Debug a(z)
If z > 0 And a(z) < a(z-1)
Debug "Fehler"
EndIf
Next
http://www.inf.fh-flensburg.de/lang/alg ... p/heap.htm
Viel Spass!