PDA

Просмотр полной версии : [Помогите!] Request сортировка методом Двоичнго Дерева (Pascal)


FFForever
19.10.2010, 21:46
Request сортировка чисел методом Двоичнго Дерева (Pascal)
Чем проще написано тем лучше.

Рэйзор
20.10.2010, 10:42
Называй проще - это сортировка методом хипа (кучи):
Это мое решение под делфи:

program HeatSort;
{$R+}
{$O-}
{$APPTYPE CONSOLE}
uses
SysUtils;
var n,i,hs,s,y:longint;
h,a: packed array[1..100000] of integer;
procedure siftup(i:longint);
begin
if i=1 then
exit;
if h[i]<h[i div 2] then
begin
y:=h[i];
h[i]:=h[i div 2];
h[i div 2]:=y;
siftup(i div 2);
end;
end;
procedure Siftdown(i:longint);
begin
if (2*i<=hs) and (h[2*i]<h[i]) then
s:=2*i else
s:=i;
if (2*i+1<=hs) and (h[2*i+1]<h[s]) then
s:=2*i+1;
if s<>i then
begin
y:=h[s];
h[s]:=h[i];
h[i]:=y;
siftdown(s);
end;
end;
procedure Delete(i:longint);
begin
h[i]:=h[hs];
dec(hs);
siftdown(i);
end;
procedure Add(x:longint);
begin
inc(hs);
h[hs]:=x;
siftup(hs);
end;
begin
reset(input,'input.txt');
rewrite(output,'output.txt');
read(n);
hs:=0;
for i := 1 to n do
read(a[i]);
for i := 1 to n do
add(a[i]);
for i := 1 to n do
begin
a[i]:=h[1];
Delete(1);
end;
for i := 1 to n do
write(a[i],' ');
end.


для паскаля убери:

{$R+}
{$O-}
{$APPTYPE CONSOLE}
uses
SysUtils;

Самая простая реализация, работает за O(N*logN)
Вроде есть какая-то модифицированная версия, работающая за O(logN) - но я ее не знаю)

Если нужны другие типы сортировок - пиши.

Пы сы: если будет ругаться - сотри слово packed из var'а

FFForever
21.10.2010, 23:55
Называй проще - это сортировка методом хипа (кучи)
Проще это метод двоичного дерева :pandal:
Во вторник затестю.

Dzhakomaus
05.12.2012, 11:59
Можете пожалуйста скинуть код такой же сортировки только в обратном порядке