Во искупление допущенной ошибки написал все три метода
правда вряд ли оптимизированные (кто желает может выложить оптимизированные)
немного оптимизированный "метод пузрьков"
Код:
Procedure Sort_Array( Var Mas:Tdar);
var
i,h :integer;
r :Tturi;
chan:boolean;
Begin
for h := high(Mas) downto 1 do
begin
chan := false;
for i := 1 to h do
if AnsiCompareStr(Mas[i-1].Country, Mas[i].Country) > 0 then
//if Mas[i-1].Country > Mas[i].Country then
begin
r := Mas[i-1];
Mas[i-1] := Mas[i];
Mas[i] := r;
chan := true;
end;
if not chan then break;
end;
End;
"метод отбора" (возможно прямой вставки)
Код:
// "метод отбора" (возможно прямой вставки)
// без создания дополнительного массива
Procedure Sort_Array( Var Mas:Tdar);
var
i,k,Kmin :integer;
r :Tturi;
Begin
for k := 0 to high(Mas) - 1 do
// k - номер уже отсортированного элемента к концу цикла
begin
Kmin := k; // Kmin - номер элемента с минимальным значением
for i := k + 1 to high(Mas) do
if AnsiCompareStr(Mas[Kmin].Country, Mas[i].Country) > 0 then
//if Mas[Kmin].Country > Mas[i].Country then
begin
Kmin := i;
end;
if Kmin <> k then
begin
r := Mas[k];
Mas[k] := Mas[Kmin];
Mas[Kmin] := r;
end;
end;
End;
"метод вставки"
Код:
// "метод вставки"
// без создания дополнительного массива
Procedure Sort_Array( Var Mas:Tdar);
var
i,k,Kmin :integer;
r :Tturi;
chan:boolean;
Begin
for k := 1 to high(Mas) do
// k - номер элемента вставляемого в упорядоченный массив [0..k-1]
begin
r := Mas[k];
chan := false;
for i := k - 1 downto 0 do
begin
if AnsiCompareStr(Mas[i].Country, r.Country) > 0 then
//if Mas[i].Country > r.Country then
begin
Mas[i+1] := Mas[i];
end
else
begin
if k <> (i+1) then Mas[i+1] := r;
chan := true;
break;
end;
end;
if not chan then Mas[0] := r;
end;
End;