Delphi: отсортированный список - PullRequest
2 голосов
/ 21 марта 2010

Мне нужно отсортировать около 1 000 000 записей с плавающей точкой в ​​Delphi. Я новичок в Delphi и хотел бы знать, есть ли какие-либо готовые решения доступны. Я испробовал несколько конструкций, представленных на языке, и для их завершения потребовалось слишком много времени (для выполнения приложения 5-10 секунд - отлично)

Ответы [ 2 ]

14 голосов
/ 21 марта 2010

почему бы просто не реализовать алгоритм быстрой сортировки?

см. Этот простой код

program ProjectSortFoat;

{$APPTYPE CONSOLE}

uses
  SysUtils;

procedure QuickSort(var List: array of Double; iLo, iHi: Integer) ;
var
  Lo       : integer;
  Hi       : integer;
  T        : Double;
  Mid      : Double;
begin
  Lo := iLo;
  Hi := iHi;
  Mid:= List[(Lo + Hi) div 2];
  repeat

    while List[Lo] < Mid do Inc(Lo) ;
    while List[Hi] > Mid do Dec(Hi) ;

    if Lo <= Hi then
    begin
      T := List[Lo];
      List[Lo] := List[Hi];
      List[Hi] := T;
      Inc(Lo);
      Dec(Hi);
    end;

  until Lo > Hi;

  if Hi > iLo then QuickSort(List, iLo, Hi);
  if Lo < iHi then QuickSort(List, Lo, iHi);

end;



const
Elements = 1000000;
var
  doubleArray : array of Double;
  i           : integer;
  t           : TDateTime;
begin
  SetLength(doubleArray,Elements);
  try
    t:=Now;
    Writeln('Init Generating '+FormatFloat('#,',Elements)+' random numbers ');
    for i:=low(doubleArray) to high(doubleArray) do
    doubleArray[i]:=Random(10000000)+Random; //can be improved
    Writeln('Elapsed '+FormatDateTime('HH:NN:SS.ZZZ',Now-t));

    t:=Now;
    Writeln('Sorting '+FormatFloat('#,',Elements)+' random numbers ');
    QuickSort(doubleArray, Low(doubleArray), High(doubleArray)) ;
    Writeln('Elapsed '+FormatDateTime('HH:NN:SS.ZZZ',Now-t));

  finally
  Finalize(doubleArray);
  end;
  Readln;
end.

в моей машине время выполнения для сортировки 1.000.000 чисел с плавающей запятой составляет 0.167 секунд .

если у вас есть Delphi 7 или другая более старая версия (я не знаю, существует ли в новых версиях), вы можете проверить

C: \ Program Files \ Borland \ Delphi7 \ Demos \ Темы

путь, для классного демо-приложения, использующего разные алгоритмы сортировки потоков.

2 голосов
/ 21 марта 2010

Какую версию вы используете? Если вы находитесь в Delphi 2009 или 2010, вы можете использовать обобщенные значения для создания TList<real> и вызова его метода сортировки.

Если вы работаете в более ранней версии, неуниверсальный TList также имеет метод Sort, но его немного сложнее настроить, поскольку он использует указатели и Real (или Double), что вам, вероятно, и нужно использовать в качестве числа с плавающей запятой, слишком велико для приведения к указателю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...