unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
const
MAX = 10000; //максимальный размер массива
type
//тип - массив для сортировки
TArray = array[1..MAX] of integer;
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
GroupBox1: TGroupBox;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Memo1: TMemo;
Memo2: TMemo;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
size : integer; //размер массива
A : TArray; //массив
implementation
{$R *.lfm}
{ TForm1 }
//генерация массива размером size
procedure GenerateArray(var a : TArray; size : integer);
var
i : integer;
begin
Randomize;
for i := 1 to size do
a[i] := -250 + Random(500); //случайное от -250 до 250
end;
//копирование массива
procedure CopyArray(a : TArray; size : integer; var b : TArray);
var
i : integer;
begin
for i := 1 to size do
b[i] := a[i];
end;
//сортировка обменом (пузырьковая)
//cmp - переменная для кол-ва обменов, swp - перестановок
procedure BubbleSort(var a : TArray; size : integer; var cmp : integer; var swp : integer);
var
i, j, t : integer;
begin
cmp := 0; swp := 0;
for i := 1 to size do
for j := 1 to size - i do
begin
inc(cmp); //+1 сравнение
if a[j] > a[j + 1] then
begin
//перестановка
t := a[j+1];
a[j+1] := a[j];
a[j] := t;
inc(swp); //+1 перестановка
end;
end;
end;
//сортировка вставками
//cmp - переменная для кол-ва обменов, swp - перестановок
procedure InsertionSort(var a : TArray; size : integer; var cmp : integer; var swp : integer);
var
i, j, t : integer;
begin
cmp := 0; swp := 0;
for i := 2 to size do
begin
t := a[i]; //необходимо вставить в нужное место i-тый элемент
j := i - 1; //просматривать начнем с позиции на 1 левее
Inc(cmp); //первое сравнение на данном шаге
while (j >= 1) and (a[j] > t) do //пока не дойдем до начала массива или элемента, меньше текущего
begin
a[j + 1] := a[j];
j := j - 1;
Inc(cmp); //+1 следующее сравнение
end;
a[j + 1] := t; //вставляем элемент в найденное место
inc(swp); //+1 перестановка
end;
end;
//кнопка "Сгенерировать"
procedure TForm1.Button1Click(Sender: TObject);
var
i : integer;
begin
size := StrToInt(Edit1.Text);
GenerateArray(A, size);
//вывод на экран
Memo1.Lines.Clear;
for i := 1 to size do
Memo1.Text:= Memo1.Text + IntToStr(A[i]) + ' ';
end;
//кнопка "сортировать"
procedure TForm1.Button2Click(Sender: TObject);
var
B : TArray;
i, c, s : integer;
begin
CopyArray(A, size, B); //копируем исходный массив (чтобы исходный оставался прежним для новой сортировки)
if (RadioButton1.Checked) then //в зависимости от выбранного типа сортировки (выбранного переключателя)
BubbleSort(B, size, c, s) //пузырьковая сортировка
else
InsertionSort(B, size, c, s); //сортировка вставками
//вывод на экран
Memo2.Lines.Clear;
for i := 1 to size do
Memo2.Text:= Memo2.Text + IntToStr(B[i]) + ' ';
//вывод результатов
Label4.Caption := 'Сравнений: ' + IntToStr(c);
Label5.Caption := 'Перестановок: ' + IntToStr(s);
end;
end.