Сортировка
Често при работа с данни възниква нужда от тяхното подреждане по зададен критерий.
Например ако те са числови можем да ги подредим в намаляващ или растящ ред.
А ако са думи - по азбучен.
В програмата са предложени две сортировки на числов масив във възходящ ред.
При първата – "метод на мехурчето" ( Sort1 ), започвайки отгоре и движейки се надолу,
сравняваме всеки два съседни елемента.
Ако те са неправилно подредени разменяме техните места.
В резултат на едно преминаване, най – големият елемент попада най – отдолу.
Така, че е по-добре този вариант да се нарече "метод на камъка".
При следващото преминаване последният елемент не се отчита.
При втората ( Sort2 ), се намира минималния елемент в масива, заедно с неговия номер и се разменя с първия.
Така първият елемент е подреден и повече той се изключва от разглеждането.
С останалите се постъпва аналогично.
Дефинираме тип, съдържащ елементите за сортиране и техния брой.
type TArray=record
El:array [1..100]of integer;
Count:integer;
end;
Тази дефиниция трябва непосредствено да прадхожда дефиницията на формата.
В раздела за дефиниране на променливите на приложението (var), непосредствено под
променливата за формата ( Form1: TForm1; ) декларираме нашата: (arL:TArray; )
Във формата добавяме обект от тип "String Grid".
Задействайки инспектора на обектите (Object Inspector) с клавиш F11 променяме броят на колоните му (Col Count) на 2.
В Първата колона ще разположим несортираните елементи от масива а във втората – сортираните.
Задействайте инспектора на обектите (Object Inspector) и преминете на събитията ( Events) свързани с формата.
Щракнете на On Activate два пъти.
При възникването на това събитие ще запълним масива със случайни прости числа.
Кодът трябва да приеме този вид:
Първоначално запълване на масива и неговото изобразяване
procedure TForm1.FormActivate(Sender: TObject);
var i:integer;
begin
//Броят на елементите от масива е равен на броя на редовете в низовата решетка
arL.Count:=StringGrid1.RowCount-1;
for i:=1 to StringGrid1.RowCount-1 do begin
//Случайно число от 0 до 9
arL.El[i]:=random(10);
//Неговото изобразяване в клетката ( Cells[колона, ред];
//IntToStr(integer) преобразува цяло число в низ
StringGrid1.Cells[0,i]:=IntToStr(arL.El[i]);
end;
end;
Сортировките
Аргумента на процедурите е от нашия, деклариран тип.
procedure Sort1(var arrF:TArray);
var i,j,nMin,Min,H:integer;
begin
for i:=1 to ArrF.Count-1 do begin
//Намиране на минималния елемент, от i – тия нататък.
//Номерът му е в nMin.
Min:=arrF.El[i]; nMin:=i;
for j:=i to ArrF.Count do begin
if Min>arrF.El[j] then begin Min:=arrF.El[j];nMin:=j; end;
end;
//Разменяме минималния елемент с i– тия.
H:=arrF.El[i]; arrF.El[i]:=Min; arrF.El[nMin]:=H;
end;
end;
Сортировката по "метода на мехурчето".
procedure Sort2(var arrF:TArray);
var i,j,H:integer;
begin
for i:=1 to ArrF.Count-1 do begin
for j:=1 to ArrF.Count-i do begin
//Разменяме j –тия с j+1– тия елемент ако не са правилно подредени.
if arrF.El[j]>arrF.El[j+1] then begin
H:=arrF.El[j]; arrF.El[j]:=arrF.El[j+1];
arrF.El[j+1]:=H;
end;
end;
end;
end;
Да действаме
Поставяме контрол бутон.
При двойно натискане на бутона се появява празна процедура,
която ще се изпълни при възникването на това събитие.
Трябва да и променим съдържанието.
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
arL.Count:=StringGrid1.RowCount-1;
for i:=1 to StringGrid1.RowCount-1 do begin
//Приемане на елементите на масива от низовата решетка.
arL.El[i]:=StrToInt(StringGrid1.Cells[0,i]);
end;
Sort2(arL);
for i:=1 to StringGrid1.RowCount-1 do begin
//Изобразяване на елементите на масива в низовата решетка.
StringGrid1.Cells[1,i]:=IntToStr(arL.El[i]);
end;
end;
Ако желаете да променяте низовете от решетката, трябва опцията (options) редактиране (goEditng) да бъде активна (True).
Това става с помоща на инспектора.
Осмелявам се да задам два въпроса:
Кой алгоритъм е по-ефективен по отношение на време и памет? От какъв порядък еса двата алгоритма?