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

Delphi Sources



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.01.2014, 23:33
aquatell aquatell вне форума
Прохожий
 
Регистрация: 21.04.2011
Сообщения: 31
Репутация: 10
Лампочка Сортировать одномерный массив записей

Здравствуйте!
Ребята подскажите пожалуйста какой алгоритм будет являться самым быстрым для сортировки одномерного динамического массива записей на 1 млн строк.
Массив у меня динамический и размерность я устанавливаю в цикле, в результате он равен = 1 млн.

Код:
type
  X=Record
  Domain: String;
  ZoneDomain: String;
end; 

Var
Arr:array of X;
I:Integer;

Begin
// Устанавливаю размер
SetLength(Arr,1000000);

//Дальше заполняю вот так
 for i:=0 to 1000000 do
 begin
 Arr[AllStr].Domain:='доменное имя';
 Arr[AllStr].ZoneDomain:='доменная зона например com';
 end;
 end;
 { Теперь надо весь этот массив отсортировать по доменному имени, чтобы шли в алфавитном порядке.
 Алгоритм методом шела слишком медленный , а на другие не хватает опыта слишком сложные }

Последний раз редактировалось aquatell, 10.01.2014 в 23:37.
Ответить с цитированием
  #2  
Старый 11.01.2014, 08:49
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,088
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Методом вставки в хеш-таблицу. Ну или, как вариант, бин-сорт. Только он памяти съест много, т.к. фактически создается вторая копия. Но тут поможет вариант сортировки сразу при чтении. Я бы попробовал реализовать именно бин-сорт, если данные подходят. Т.е. получится некоторая комбинация бин-сорт и сортировки вставкой.
Пусть у нас даменные имена состоят только из маленьких английских букв. В таком случае первый шаг при вводе новой записи будет "укладка" ее в соотв. ячейку массива. А вторым шагом - вставка в соотв. список внутри соотв. ячейки в нужную позицию. При этом массив можно описать примерно следующим способом:
Код:
var
  A : array ['a'..'z'] Of TList<X>;
Ответить с цитированием
Этот пользователь сказал Спасибо lmikle за это полезное сообщение:
aquatell (11.01.2014)
  #3  
Старый 11.01.2014, 13:18
aquatell aquatell вне форума
Прохожий
 
Регистрация: 21.04.2011
Сообщения: 31
Репутация: 10
По умолчанию

Применил очень шустрый алгоритм, один из быстрых.
Он так и называется "Быстрая сортировка".
1 млн записей сортирует за 3 сек. На 4-х ядерном процессоре 2,4 Ghz
Другие алгоритмы очень долго с этим справляются - в частности "пузырьком" и "вставкой", они хороши для меньшего количества записей.
Собственно вот сам код алгоритма "Быстрая сортировка", может многим пригодится
Код:
{Сортировка QuickSort}

procedure QuickSort(var data: array of double);

procedure QSort(var b: array of double; iLo, iHi: Integer);

var

   Lo, Hi: Integer;

   Mid, t: double;

begin

   Lo := iLo;

   Hi := iHi;

   Mid := b[(Lo + Hi) div 2];

   repeat

     while b[Lo] < Mid do Inc(Lo);

     while b[Hi] > Mid do Dec(Hi);

     if Lo <= Hi then

     begin

       t := b[Lo];

       b[Lo] := b[Hi];

       b[Hi] := t;

       Inc(Lo);

       Dec(Hi);

     end;

   until Lo > Hi;

   if Hi > iLo then QSort(b, iLo, Hi);

   if Lo < iHi then QSort(b, Lo, iHi);

end;

begin

QSort(data, Low(data), High(data));

end;

Ответить с цитированием
  #4  
Старый 11.01.2014, 13:38
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
Смех

Цитата:
Сообщение от aquatell
Применил очень шустрый алгоритм, один из быстрых.
Он так и называется "Быстрая сортировка".
1 млн записей сортирует за 3 сек. На 4-х ядерном процессоре 2,4 Ghz
Другие алгоритмы очень долго с этим справляются - в частности "пузырьком" и "вставкой", они хороши для меньшего количества записей.
Собственно вот сам код алгоритма "Быстрая сортировка", может многим пригодится
Это слишком известный алгоритм чтобы о нём не знать. Например в стандартных классах TStringList и TList методы Sort используют именно быструю сортировку. Кроме того в стандартной поставке Delphi в папке "Demos\Threads" есть пример использования потоков (thread) и плюс скорости работы разных алгоритмов сортировки (пузырьковая, выбором и быстрая).
Ответить с цитированием
Этот пользователь сказал Спасибо poli-smen за это полезное сообщение:
aquatell (11.01.2014)
  #5  
Старый 11.01.2014, 14:28
aquatell aquatell вне форума
Прохожий
 
Регистрация: 21.04.2011
Сообщения: 31
Репутация: 10
По умолчанию

Цитата:
Сообщение от poli-smen
Это слишком известный алгоритм чтобы о нём не знать.
Теперь уже буду знать, я просто узнаю о некоторых вещах по мере необходимости, даже если никогда не сталкивался с подобным, стараюсь разобраться, до сих пор мне не требовались подобные алгоритмы
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

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