Сортировка слиянием работает, сортирует всё нормально, нужно добавить индексы .... На лекции было сказано, что достаточно добавить какой-либо тип, например: tIndexArray= array [1..1000] of integer; И, НАПРИМЕР, вместо условий if A[i]>A[j] then Swap(A[i],A[j]) написать if A[P[i]]>A[P[j]] then Swap(P[i],P[j])
А на деле всё походу сложнее(нужно менять параметры в процедурах ...) и у меня одни косяки получаются, уже запутался где что менятЬ! Если кто-нибудь может помочь или подсказать, помогите пожалуйста.
var Form1: TForm1; AR1,AR2: tSortArray; SW:integer;
implementation
{$R *.dfm}
function log(x,b: real):real; begin result:=ln(x)/ln(b); end;
function CHB: integer; {определение выбранного кол-ва компонент} begin Result:=Form1.seElCount.Value; end;
function Merge({P:tIndexArray;} src: TSortArray; var Dest:TSortArray; L,M,H: integer):integer; //выполняет слияние 2-х половин массива src от L до M - нижняя, //от M+1 до H - верхняя в массив Dest var i,j,k: integer; Begin Result:=0; i:=L; // первый элемент последовательности j:=M+1; // первый элемент второй половины последовательности k:=L; // место, куда записываем //пока не закончилась одна из половин while (i<=M)and(j<=H) do begin if src[i]<src[j] then // после просмотра записываем i-й элемент begin Dest[k]:=src[i]; inc(i); inc(Result); // перестановка! end else begin Dest[k]:=src[j]; // после просмотра записываем j-й элемент inc(j); inc(Result); // перестановка! end; inc(k); end; //записываем оставшиеся элементы if i>M then // дописываем правую половину while j<=H do begin Dest[k]:=src[j]; inc(j); inc(k); inc(Result); // перестановка! end else while i<=M do begin // дописываем левую половину Dest[k]:=src[i]; inc(i); inc(k); inc(Result); // перестановка! end; end;
{Процедура расщепления} function Split(L,H: integer; var src: TSortArray; var Dest: TSortArray):integer; var M: integer; // при первом обращении к данной процедуре массив Dest содержит копию src Begin Result:=0; M:=(L+H) div 2; // середина последовательности // последовательность не элементарная => требуется разбиение If L<>H then begin Result:=Result+Split(L,M,src,dest); // бисекция левой половины Result:=Result+Split(M+1,H,Src,dest); // бисекция правой половины Result:=Result+Merge(src,Dest,L,M,H); Src:=Dest; end; AR2:=Src; {(*+*)} end;
procedure TForm1.FormCreate(Sender: TObject); begin SW:=0; end;
procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin randomize; for i:=1 to CHB do AR1[i]:=random(999); ShowVectorInList(ListBox1,AR1); end;
procedure TForm1.ShowVectorInList(List:TListBox; Src:TSortArray); var i:integer; begin List.Items.Clear; for i:=1 to CHB do List.Items.Add(IntToStr(Src[i])); end;
procedure TForm1.Button2Click(Sender: TObject); var SA: tSortArray; begin SW:=0; SA:=AR1; SW:=Split(1,CHB,SA,SA); ShowVectorInList(ListBox2,AR2); end;
procedure TForm1.Button3Click(Sender: TObject); var i:integer; OldCursor:TCursor; k:real; begin OldCursor:=Screen.Cursor; Screen.Cursor:=crHourGlass; for i:=1 to Form1.seElCount.Value do begin Application.ProcessMessages; seElCount.Value:=i; //устанавливаем длину сортируемого массива Button1.click; // генерируем массив случайным образом Button2.Click; //сортируем его k:=log(i,2); Series1.AddXY(i,i*k); Series2.AddXY(i,SW); end; Screen.Cursor:=OldCursor; end;