Sorting algorithms/Heapsort: Difference between revisions
Content added Content deleted
(→{{header|Pascal}}: replaced incorrect previous version) |
|||
Line 4,291: | Line 4,291: | ||
=={{header|Pascal}}== |
=={{header|Pascal}}== |
||
{{works with|FPC}} |
|||
An example, which works on arrays with arbitrary bounds :-) |
An example, which works on arrays with arbitrary bounds :-) |
||
<syntaxhighlight lang="pascal"> |
<syntaxhighlight lang="pascal"> |
||
program HeapSortDemo; |
|||
{$mode objfpc}{$h+}{$b-} |
|||
type |
|||
TIntArray = array[4..15] of integer; |
|||
⚫ | |||
data: TIntArray; |
|||
i: integer; |
|||
procedure siftDown(var a: TIntArray; start, ende: integer); |
|||
⚫ | |||
root, child, swap: integer; |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
child := root * 2 - start + 1; |
|||
⚫ | |||
inc(child); |
|||
⚫ | |||
begin |
|||
swap := a[root]; |
|||
⚫ | |||
⚫ | |||
root := child; |
|||
⚫ | |||
else |
|||
exit; |
|||
⚫ | |||
⚫ | |||
procedure |
procedure HeapSort(var a: array of Integer); |
||
procedure SiftDown(Root, Last: Integer); |
|||
var |
var |
||
Child, Tmp: Integer; |
|||
begin |
begin |
||
⚫ | |||
count := length(a); |
|||
Child := Root * 2 + 1; |
|||
⚫ | |||
while start >= low(a) do |
|||
Inc(Child); |
|||
⚫ | |||
siftdown(a, start, high(a)); |
|||
Tmp := a[Root]; |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
end; |
end; |
||
end; |
end; |
||
⚫ | |||
I, Tmp: Integer; |
|||
procedure heapSort(var a: TIntArray); |
|||
⚫ | |||
⚫ | |||
⚫ | |||
ende, swap: integer; |
|||
SiftDown(I, High(a)); |
|||
begin |
|||
for I := High(a) downto 1 do begin |
|||
heapify(a); |
|||
Tmp := a[0]; |
|||
a[0] := a[I]; |
|||
a[I] := Tmp; |
|||
SiftDown(0, I - 1); |
|||
a[low(a)] := a[ende]; |
|||
a[ende] := swap; |
|||
dec(ende); |
|||
siftdown(a, low(a), ende); |
|||
end; |
|||
end; |
end; |
||
⚫ | |||
procedure PrintArray(const Name: string; const A: array of Integer); |
|||
⚫ | |||
I: Integer; |
|||
begin |
begin |
||
Write(Name, ': ['); |
|||
Randomize; |
|||
for I := 0 to High(A) - 1 do |
|||
writeln('The data before sorting:'); |
|||
Write(A[I], ', '); |
|||
WriteLn(A[High(A)], ']'); |
|||
begin |
|||
⚫ | |||
data[i] := Random(high(data)); |
|||
write(data[i]:4); |
|||
⚫ | |||
⚫ | |||
a1: array[-7..5] of Integer = (-34, -20, 30, 13, 36, -10, 5, -25, 9, 19, 35, -50, 29); |
|||
writeln; |
|||
a2: array of Integer = (-9, 42, -38, -5, -38, 0, 0, -15, 37, 7, -7, 40); |
|||
heapSort(data); |
|||
⚫ | |||
writeln('The data after sorting:'); |
|||
HeapSort(a1); |
|||
⚫ | |||
PrintArray('a1', a1); |
|||
begin |
|||
HeapSort(a2); |
|||
PrintArray('a2', a2); |
|||
end; |
|||
⚫ | |||
writeln; |
|||
</syntaxhighlight> |
|||
{{out}} |
{{out}} |
||
<pre> |
<pre> |
||
a1: [-50, -34, -25, -20, -10, 5, 9, 13, 19, 29, 30, 35, 36] |
|||
The data before sorting: |
|||
a2: [-38, -38, -15, -9, -7, -5, 0, 0, 7, 37, 40, 42] |
|||
12 13 0 1 0 14 13 10 1 10 9 2 |
|||
The data after sorting: |
|||
0 0 1 1 2 9 10 10 12 13 13 14 |
|||
</pre> |
</pre> |
||