Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Закрытая тема
 
Опции темы Поиск в этой теме Опции просмотра
  #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
  #2  
Старый 16.07.2009, 18:30
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,053
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

1. Использовать цикл For - минус одна проверка на итерацию.
2. Переписать механизм сравнения. у тебя он излишне сложный.

Код:
For I := Low(Contacts) To High(Contacts)-1 Do
  For J := I + 1 To High(Contacts) Do
    Begin
       If Contacts[i].Status = Contacts[J].Status
          Then
             Begin
               If Contacts[i].Nick > Contacts[J].Nick Then
                 Begin
                   Buf := Contacts[i];
                   Contacts[i] := Contacts[J];
                   Contacts[J] := Buf;
                 End;
             End
          Else
            If Contacts[i].Status > Contacts[J].Status Then
              Begin
                 Buf := Contacts[i];
                 Contacts[i] := Contacts[J];
                 Contacts[J] := Buf;
              End;
    End;
  #3  
Старый 16.07.2009, 19:02
Аватар для PhoeniX
PhoeniX PhoeniX вне форума
Always hardcore!
 
Регистрация: 04.03.2009
Адрес: СПб
Сообщения: 3,239
Версия Delphi: GCC/FPC/FASM
Репутация: 62149
По умолчанию

Чуть переделал под себя - на 500 записей срабатывает почти мгновенно. Спасибо, тема закрыта.
__________________
Оставайтесь хорошими людьми...
VK id2634397, ds [at] phoenix [dot] dj
Закрытая тема


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:05.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter