Помощь - Поиск - Пользователи - Календарь
Полная версия: Пирамидальная сортировка
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
Sensitive
Здравствуйте!
В программе должен сортироваться массив с помощью пирамидальной сортировки. И отсортированный массив должен выводиться на экран пирамидой, а не в строку как обычный отсортированный массив. Думала записывать значения массива в СтрингГрид ( в виде пирамиды), но что-то вообще ничего из этого не вышло... sad.gif
Как можно вывести на экран массив в виде пирамиды?
volvo
Цитата
отсортированный массив должен выводиться на экран пирамидой
Поясни, пожалуйста... Что значит "пирамидой"? Вот, скажем, исходный массив:
1, 3, 5, 8, 2, 6, 11, 4
Напиши, как он должен выводиться после сортировки (пользуйся тегами [cоdefaq][/cоdefaq] для того, чтобы форматировать текст, как тебе нужно, а не так, как хочет форум smile.gif ). Тогда будет ясно, какой компонент использовать для вывода информации...
Sensitive
Цитата(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
Смотри:

Код вот такой:
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
Неплохо получается. Спасибо.
Просмотрю сейчас как оно будет на больших увеличиваться в ширину smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.