Показать сообщение отдельно
  #1  
Старый 16.07.2009, 18:24
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию Сортировка динамического массива записей

Имеется вот такая структура:
Код:
type
  TStatusClient = (OffLine, OnLine, Away, Invisible);
  TInvisStateClient = (clNormal, clInvisible, clVisible, clIgnore);
  TContact=record
    Nick,EMail:string;
    status: TStatusClient;
    invis: TInvisStateClient;
  end;
var
  Contacts:array of TContact;
Надо отсортировать по состоянию (status), и по нику (nick).
Сейчас использую вот такой алгоритм:
Код:
var
  stat:string;
  i:integer;
  t:TContact;
  s1,s2:integer;
  n1,n2:string;
begin
  i:=0;
  s1:=0;
  s2:=0;
  while i<Length(Contacts)-2 do begin
    case Contacts[i].status of
      OnLine:s1:=0;
      Away:s1:=1;
      Invisible:s1:=2;
      OffLine:s1:=3;
    end;
    case Contacts[i+1].status of
      OnLine:s2:=0;
      Away:s2:=1;
      Invisible:s2:=2;
      OffLine:s2:=3;
    end;
    n1:=Contacts[i].Nick;
    n2:=Contacts[i+1].Nick;
    if(s1>s2)or((s1=s2)and(n1<n2))then begin
      t:=Contacts[i];
      Contacts[i]:=Contacts[i+1];
      Contacts[i+1]:=t;
      i:=0;
    end else inc(i);
  end;
end;
На коротком списке (5-10 записей) работает шустро, но, если записей 100-150, зависает надолго.
Что посоветуете?
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj