Имеется вот такая структура:
Код:
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, зависает надолго.
Что посоветуете?