Скачиваний:
29
Добавлен:
27.04.2015
Размер:
297.97 Кб
Скачать
  1. Программа:

unit Unit7;

interface

uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

type

TForm7 = class(TForm)

Button1: TButton;

Edit1: TEdit;

Memo1: TMemo;

Memo2: TMemo;

Button2: TButton;

Button3: TButton;

Label1: TLabel;

Label2: TLabel;

Edit2: TEdit;

Button4: TButton;

Label3: TLabel;

Label4: TLabel;

Label5: TLabel;

procedure Button1Click(Sender: TObject);

procedure Button2Click(Sender: TObject);

procedure Button3Click(Sender: TObject);

procedure Button4Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Form7: TForm7;

var

N,i,Z,s,time1,time2: integer;

M,A,B:array [1..10000000] of Integer;

implementation

{$R *.dfm}

procedure TForm7.Button1Click(Sender: TObject);

begin

N:=StrToInt(Edit2.Text);

memo1.Lines.Clear;

memo2.Lines.Clear;

for i := 1 to N do

begin

M[i]:= -500000 + random(1000000);

end;

if n<40 then

for I := 1 to n do

memo1.Lines.Add(IntToStr(M[i]));

end;

procedure TForm7.Button2Click(Sender: TObject);

Var i,j,k: integer;

Min, Max:integer;

begin

memo2.Clear;

N:=StrToInt(Edit2.Text);

time1:=GetTickCount;

for i:=1 to N div 2 do

begin

if M[i]> M[i+1]then

begin

Min:=i+1;

Max:=i;

end

else

begin

Min:=i;

Max:=i+1;

end;

for j:=i+2 to n-i+1 do

if M[j]>M[Max] then

Max:=j

else

if M[j]<M[Min] then

Min:=j;

//обмен элементов

K:=M[i];

M[i]:=M[Min];

M[Min]:=K;

if Max=i then

Max:=Min;

K:=A[N-i+1];

A[N-i+1]:=A[max];

A[max]:=K;

end;

time2:=GetTickCount;

s:=time2-time1;

Edit1.Text:=IntToStr(s);

if n<40 then

for I := 1 to n do

memo2.Lines.Add(IntToStr(M[i]));

end;

procedure TForm7.Button3Click(Sender: TObject);

Var d,i,t: integer;

k : boolean; { пpизнак пеpестановки }

begin

memo2.Clear;

N:=StrToInt(Edit2.Text);

time1:=GetTickCount;

d:=N div 2; { начальное значение интеpвала }

while d>0 do

begin { цикл с yменьшением интеpвала до 1 }

{ пyзыpьковая соpтиpовка с интеpвалом d }

k:=true;

while k do

begin { цикл, пока есть пеpестановки }

k:=false; i:=1;

for i:=1 to N-d do

begin

{ сpавнение эл-тов на интеpвале d }

if M[i]>M[i+d] then

begin

t:=M[i];

M[i]:=M[i+d];

M[i+d]:=t; { пеpестановка }

k:=true; { пpизнак пеpестановки }

end; { if ... }

end; { for ... }

end; { while k }

d:=d div 2; { yменьшение интеpвала }

end; { while d>0 }

time2:=GetTickCount;

s:=time2-time1;

Edit1.Text:=IntToStr(s);

if n<40 then

for I := 1 to n do

memo2.Lines.Add(IntToStr(M[i]));

end;

Procedure Sliv(p,q : integer); {процедура сливающая массивы}

Var r,i,j,k : integer;

Begin

r:=(p+q) div 2;

i:=p;

j:=r+1;

for k:=p to q do

if (i<=r) and ((j>q) or (m[i]<m[j])) then

begin

b[k]:=m[i];

i:=i+1;

end

else

begin

b[k]:=m[j];

j:=j+1;

end ;

for k:=p to q do

m[k]:=b[k];

End;

Procedure Sort(p,q : integer); {p,q — индексы начала и конца сортируемой части массива}

Begin

if p<q then {массив из одного элемента тривиально упорядочен}

begin

Sort(p,(p+q) div 2);

Sort((p+q) div 2 + 1,q);

Sliv(p,q);

end;

End;

procedure TForm7.Button4Click(Sender: TObject);

begin

memo2.Clear;

time1:=GetTickCount;

Sort(1,N);

time2:=GetTickCount;

s:=time2-time1;

Edit1.Text:=IntToStr(s);

if n<40 then

for I := 1 to n do

memo2.Lines.Add(IntToStr(M[i]));

end;

end.