Показать сообщение отдельно
  #13  
Старый 17.03.2008, 21:02
Аватар для s0Creator
s0Creator s0Creator вне форума
Местный
 
Регистрация: 20.02.2008
Адрес: Московская область
Сообщения: 420
Репутация: 884
По умолчанию

Во искупление допущенной ошибки написал все три метода
правда вряд ли оптимизированные (кто желает может выложить оптимизированные)
немного оптимизированный "метод пузрьков"
Код:
 
  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;
Ответить с цитированием