aydarbiktimirov icon

heapsort

aydarbiktimirov | PRO | 01/20/12 06:02:24 PM UTC | 0 ⭐ | 345 👁️ | Never ⏰ | []
Pascal |

1.01 KB

|

None

|

0 👍

/

0 👎

procedure swap(var a: integer; var b: integer);
var
    tmp: integer;
begin
    tmp:=a;
    a:=b;
    b:=tmp;
end;
 
procedure shift_down(var a: array of integer; i: integer; len: integer);
var
    l: integer;
begin
    l:=i;
    if (2 * i + 1 < len) and (a[l] < a[2 * i + 1]) then
        l:=2 * i + 1;
    if (2 * i + 2 < len) and (a[l] < a[2 * i + 2]) then
        l:=2 * i + 2;
    swap(a[i], a[l]);
    if l <> i then
        shift_down(a, l, len);
end;
 
procedure shift_up(var a: array of integer; i: integer);
begin
    while (a[(i - 1) div 2] < a[i]) do
    begin
        swap(a[i], a[(i - 1) div 2]);
        i:=(i - 1) div 2;
    end;
end;
 
procedure heap_sort(var a: array of integer);
var
    i: integer;
begin
    for i:=0 to length(a) - 1 do
        shift_up(a, i);
    for i:=length(a) - 1 downto 1 do
    begin
        swap(a[0], a[i]);
        shift_down(a, 0, i);
    end;
end;
 
var
    a: array of integer;
    n, i: integer;
 
begin
    read(n);
    setlength(a, n);
    for i:=0 to n - 1 do
        read(a[i]);
    heap_sort(a);
    for i:=0 to n - 1 do
        write(a[i], ' ');
    writeln();
end.

Comments