Сортировка

Често при работа с данни възниква нужда от тяхното подреждане по зададен критерий. 
Например ако те са числови можем да ги подредим в намаляващ или растящ ред. 
А ако са думи  - по азбучен.
В програмата са предложени две сортировки на числов масив във възходящ ред. 
При първата – "метод на мехурчето" ( 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).
Това става с помоща на инспектора.
Осмелявам се да задам два въпроса:
Кой алгоритъм е по-ефективен по отношение на време и памет? От какъв порядък еса двата алгоритма?