Консультация № 171523
22.08.2009, 10:31
0.00 руб.
0 4 1
Здравствуйте уважаемые эксперты! Помогите пожалуйста написать программу-пример сортирования выведенной
случайной последовательности чисел на Memo1 (после нажатия на кнопку1) методом "пирамидальной сортировки"
и последующем выводом отсортированной последовательности на Memo2 (после нажатия на кнопку2). Спасибо всем :)

Обсуждение

давно
Профессионал
153662
1070
22.08.2009, 14:39
общий
это ответ
Здравствуйте, Николай // Programmator .
Предлагаю свой вариант решения данной задачи
Код:
unit Unit10;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
Memo2: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
ar: array [0..99] of integer;

implementation

{$R *.dfm}

procedure Sort(var Arr: array of integer; Count: Integer);

procedure DownHeap(index, Count: integer; Current: integer);
//Функция пробегает по пирамиде восстанавливая ее
//Также используется для изначального создания пирамиды
//Использование: Передать номер следующего элемента в index
//Процедура пробежит по всем потомкам и найдет нужное место для следующего элемента
var
Child: Integer;
begin
while index < Count div 2 do begin
Child := (index+1)*2-1;
if (Child < Count-1) and (Arr[Child] < Arr[Child+1]) then
Child:=Child+1;
if Current >= Arr[Child] then
break;
Arr[index] := Arr[Child];
index := Child;
end;
Arr[index] := Current;
end;

//Основная функция
var
i: integer;
Current: integer;
begin
//Собираем пирамиду
for i := (Count div 2)-1 downto 0 do
DownHeap(i, Count, Arr[i]);
//Пирамида собрана. Теперь сортируем
for i := Count-1 downto 0 do begin
Current := Arr[i]; //перемещаем верхушку в начало отсортированного списка
Arr[i] := Arr[0];
ar[i]:= arr[i];
DownHeap(0, i, Current); //находим нужное место в пирамиде для нового элемента
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
Memo1.Clear;
Memo2.Clear;
for i:= 0 to 99 do
begin
ar[i]:= random(100);
Memo1.Lines.Add(IntToStr(ar[i]));
end;
Sort(ar, 100);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
begin
for I := 0 to 99 do
Memo2.Lines.Add(IntToStr(ar[i]))
end;

end.

После нажатия на 1 кнопку, происходит заполнения исходного массива случайными числами в количестве 100 шт. И вызов процедуры сортировки методом пирамиды (Sort(ar, 100);), процедура была взята с сайта ВикипедиЯ. Вывод на 2 memo происходит после нажатия 2 кнопки.
5
Cпасибо Вам! Сортировку выбором и методом Шелла в Deplhi реализовал, а вот с пирамидальной по сложнее :(( Спасибо Вам ещё раз :))
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

давно
Мастер-Эксперт
425
4118
23.08.2009, 04:29
общий
Николай // Programmator :
А числа в МЕМО1 у Вас как помещаются - в строчку, в столбик или квадратом?
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
23.08.2009, 09:10
общий
Программу в ответе ещё не проверял, но в программах сортировки методом Шелла и выбором - построчно, т.е. Memo1.Lines.Add(IntToStr(A[I]));
давно
Профессионал
153662
1070
24.08.2009, 12:02
общий
У меня в ответе числа помещаются в столбик, переделать в строчку или квадратом не проблема.
Об авторе:
Мои программы со статусом freeware для Windows на моём сайте jonix.ucoz.ru

Форма ответа