Здравствуйте! В программе должен сортироваться массив с помощью пирамидальной сортировки. И отсортированный массив должен выводиться на экран пирамидой, а не в строку как обычный отсортированный массив. Думала записывать значения массива в СтрингГрид ( в виде пирамиды), но что-то вообще ничего из этого не вышло... Как можно вывести на экран массив в виде пирамиды?
volvo
6.06.2009 15:05
Цитата
отсортированный массив должен выводиться на экран пирамидой
Поясни, пожалуйста... Что значит "пирамидой"? Вот, скажем, исходный массив: 1, 3, 5, 8, 2, 6, 11, 4 Напиши, как он должен выводиться после сортировки (пользуйся тегами [cоdefaq][/cоdefaq] для того, чтобы форматировать текст, как тебе нужно, а не так, как хочет форум ). Тогда будет ясно, какой компонент использовать для вывода информации...
Sensitive
6.06.2009 15:35
Цитата(volvo @ 6.06.2009 15:05)
Поясни, пожалуйста... Что значит "пирамидой"? Вот, скажем, исходный массив: 1, 3, 5, 8, 2, 6, 11, 4 Напиши, как он должен выводиться после сортировки (пользуйся тегами [cоdefaq][/cоdefaq] для того, чтобы форматировать текст, как тебе нужно, а не так, как хочет форум ). Тогда будет ясно, какой компонент использовать для вывода информации...
1, 3, 5, 8, 2, 6, 11, 4 для этого массива будет так:
Код
1 2 3 4 5 6 8 11
В итоге на рисунке образуется как бы пирамида из этого массива. От каждого элемента отходит две ветви вниз. (вроде бы так поянисла)
volvo
6.06.2009 16: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;
При больших массивах катастрофически быстро разрасталось в ширину, поэтому пришлось потом проходить по всем столбцам, и для тех, которые пустые, сбрасывать их ширину до 2-х, можно и до 1-цы тоже Изначально ширина колонок в StringGrid-е выставлена в 25...
Так пойдет?
Sensitive
6.06.2009 18:52
Неплохо получается. Спасибо. Просмотрю сейчас как оно будет на больших увеличиваться в ширину
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.