Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2016, 15:51   #11
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
Радость

Всё, задача решена. Почитал что такое "быстрая сортировка" и переделал код, в итоге всё работает почти мгновенно. Всем спасибо!


Код:
type
 TLRec = record
  _1, _2, _3, _4, _5: string;
  aDate: TDateTime;
  end;
  TLArr = array of TLRec;

...

var
 ARR: TLArr;


procedure SortArrayList(var A: array of TLRec; iLo, iHi: Integer) ;
 var
   Lo, Hi: Integer;
   Pivot, T: TDateTime;
 begin
   Lo := iLo;
   Hi := iHi;
   Pivot := A[(Lo + Hi) div 2].aDate;
   repeat
     while A[Lo].aDate < Pivot do Inc(Lo) ;
     while A[Hi].aDate > Pivot do Dec(Hi) ;
     if Lo <= Hi then
     begin
       T := A[Lo].aDate;
       A[Lo] := A[Hi];
       A[Hi].aDate := T;
       Inc(Lo) ;
       Dec(Hi) ;
     end;
   until Lo > Hi;
   if Hi > iLo then SortArrayList(A, iLo, Hi) ;
   if Lo < iHi then SortArrayList(A, Lo, iHi) ;
 end;

...

SortArrayList(ARR, Low(ARR), High(ARR));
garuna вне форума Ответить с цитированием
Старый 19.05.2016, 15:54   #12
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

что-то меня эта строчка очень смущает:
Цитата:
Код:
A[Lo] := A[Hi];
Вы уверены, что код работает корректно и не затирает строковые данные в массиве?!!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.05.2016, 16:28   #13
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
что-то меня эта строчка очень смущает:

Вы уверены, что код работает корректно и не затирает строковые данные в массиве?!!
Точно, поспешил
вот так правильно:

Код:
procedure SortArrayList(var A: array of TLRec; iLo, iHi: Integer) ;
 var
   Lo, Hi: Integer;
   Pivot: TDateTime;
   T: TLRec;
 begin
   Lo := iLo;
   Hi := iHi;
   Pivot := A[(Lo + Hi) div 2].aDate;
   repeat
     while A[Lo].aDate < Pivot do Inc(Lo) ;
     while A[Hi].aDate > Pivot do Dec(Hi) ;
     if Lo <= Hi then
     begin
       T := A[Lo];
       A[Lo] := A[Hi];
       A[Hi] := T;
       Inc(Lo) ;
       Dec(Hi) ;
     end;
   until Lo > Hi;
   if Hi > iLo then SortArrayList(A, iLo, Hi) ;
   if Lo < iHi then SortArrayList(A, Lo, iHi) ;
 end;
garuna вне форума Ответить с цитированием
Старый 19.05.2016, 16:41   #14
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
вот так правильно:
вот, теперь другое дело!
Поздравляю!

p.s. просто любопытство ради, если сравните ваш SortArrayList
и тот, что был в постах#3/#7:
Код:
for i:= 0 to Length(A)-2 do
 for j:= i+1 to Length(A)-1 do
 begin
  if A[j].aDate < A[i].aDate  //сортируем по дате
  then
  begin
   TempArr:= A[i];
   A[i]:= A[j];
   A[j]:= TempArr;
  end;
 end;
Разница в скорости (времени выполнения) большая?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.05.2016, 17:21   #15
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
Радость

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
Разница в скорости (времени выполнения) большая?


Результаты сортировки 10.000 записей.

Мой изначальный код (без StrToDateTime): 19505 мс.
Код из поста #7 (без StrToDateTime): 19962 мс.
Код из поста #13: 28 мс.
garuna вне форума Ответить с цитированием
Старый 19.05.2016, 17:35   #16
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

спасибо за ответ!

Это просто фантастика!!
Цитата:
Код из поста #7 (без StrToDateTime): 19962 мс.
простите, позволю себе переспросить - код такой, как я привёл в пост #14 ?!
(там цикл по j совсем другой, если Вы обратите внимание)!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.05.2016, 17:44   #17
Dvoishnik
Форумчанин
 
Регистрация: 12.02.2011
Сообщений: 808
По умолчанию

И мне интересно с моим кодом результаты.
Терпение!Дежурный экстрасенс скоро свяжется с вами!
Dvoishnik вне форума Ответить с цитированием
Старый 19.05.2016, 18:23   #18
garuna
Форумчанин
 
Аватар для garuna
 
Регистрация: 13.04.2013
Сообщений: 180
По умолчанию

ну в общем-то да, всё таки ваш код быстрее немного. надо было просто несколько раз проверить и посмотреть средние результаты.

Ваш:
19 092 мс
18 963 мс
19 446 мс
19 180 мс

Мой изначальный (без StrToDateTime):
19 364 мс
19 360 мс
19 509 мс
19 430 мс

Если интересно, прилагаю исходник с замерами.
sort.zip

Цитата:
Сообщение от Dvoishnik Посмотреть сообщение
И мне интересно с моим кодом результаты.
ваш код Access Violation выбивает
garuna вне форума Ответить с цитированием
Старый 19.05.2016, 20:22   #19
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

garuna, спасибо, обязательно гляну примерчик!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка как заставить код формировать сортировку по месту расположения верхней строки сортируемого массива Trimbl Microsoft Office Excel 1 29.04.2016 07:27
Реализовать сортировку массива записей Tuns Помощь студентам 0 26.05.2014 15:51
Не знаю как реалтзовать сортировку массива (Паскаль) WRNWRN Помощь студентам 7 20.12.2010 22:07
Запрос на сортировку записей по должности? Azeripatriot Microsoft Office Access 5 26.04.2010 17:06