Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Пирамидальная сортировка

Автор: Sensitive 6.06.2009 18:36

Здравствуйте!
В программе должен сортироваться массив с помощью пирамидальной сортировки. И отсортированный массив должен выводиться на экран пирамидой, а не в строку как обычный отсортированный массив. Думала записывать значения массива в СтрингГрид ( в виде пирамиды), но что-то вообще ничего из этого не вышло... sad.gif
Как можно вывести на экран массив в виде пирамиды?

Автор: volvo 6.06.2009 19:05

Цитата
отсортированный массив должен выводиться на экран пирамидой
Поясни, пожалуйста... Что значит "пирамидой"? Вот, скажем, исходный массив:
1, 3, 5, 8, 2, 6, 11, 4
Напиши, как он должен выводиться после сортировки (пользуйся тегами [cоdefaq][/cоdefaq] для того, чтобы форматировать текст, как тебе нужно, а не так, как хочет форум smile.gif ). Тогда будет ясно, какой компонент использовать для вывода информации...

Автор: Sensitive 6.06.2009 19:35

Цитата(volvo @ 6.06.2009 15:05) *

Поясни, пожалуйста... Что значит "пирамидой"? Вот, скажем, исходный массив:
1, 3, 5, 8, 2, 6, 11, 4
Напиши, как он должен выводиться после сортировки (пользуйся тегами [cоdefaq][/cоdefaq] для того, чтобы форматировать текст, как тебе нужно, а не так, как хочет форум smile.gif ). Тогда будет ясно, какой компонент использовать для вывода информации...


1, 3, 5, 8, 2, 6, 11, 4 для этого массива будет так:

Код

                 1
           2         3
        4    5   6     8
    11

В итоге на рисунке образуется как бы пирамида из этого массива. От каждого элемента отходит две ветви вниз. (вроде бы так поянисла)

Автор: volvo 6.06.2009 20:30

Смотри:

Код вот такой:

procedure DrawHeap(const a: array of integer;
n: integer; var SG: TStringGrid);
var
level, levels: integer;
cnt, i, j, LWidth: integer;
b: boolean;
begin
levels := trunc(ln(n)/ln(2)) + 1;
SG.FixedCols := 0; SG.FixedRows := 0;

SG.ColCount := levels * 8;
SG.RowCount := levels;

level := 0; cnt := -1;
while cnt < n do begin
for i := 1 to 1 shl level do begin
LWidth := SG.ColCount div (1 shl level);
Form1.Memo1.Lines.Add(IntToStr(LWidth));
inc(cnt);
if cnt = n then break;

SG.Cells[pred(i) * LWidth + (LWidth div 2), level] := IntToStr(a[cnt]);
end;
inc(level);
end;
for i := 0 to SG.ColCount - 1 do begin
b := true;
for j := 0 to SG.RowCount do begin
b := b and (SG.Cells[i, j] = '');
end;
if b then SG.ColWidths[i] := 2;
end;
end;

const
n = 8;
arr: array[1 .. n] of integer = (
1, 2, 3, 4, 5, 6, 8, 11
);

procedure TForm1.Button7Click(Sender: TObject);
begin
//
DrawHeap(arr, n, StringGrid1);
end;


Вот что получается:
Прикрепленное изображение

При больших массивах катастрофически быстро разрасталось в ширину, поэтому пришлось потом проходить по всем столбцам, и для тех, которые пустые, сбрасывать их ширину до 2-х, можно и до 1-цы тоже smile.gif
Изначально ширина колонок в StringGrid-е выставлена в 25...

Так пойдет?

Автор: Sensitive 6.06.2009 22:52

Неплохо получается. Спасибо.
Просмотрю сейчас как оно будет на больших увеличиваться в ширину smile.gif