極めて速い正の整数ソート関数

1789 ワード

実現原理:比較バイナリビット.


unit Unit1;



interface



uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls;



type

  TForm1 = class(TForm)

    Button1: TButton;

    Memo1: TMemo;

    procedure Button1Click(Sender: TObject);

    procedure FormCreate(Sender: TObject);

  end;



var

  Form1: TForm1;



implementation



{$R *.dfm}



type

  TIntArr = array of Integer;



{ }

procedure IntSort(arr:TIntArr; low:Integer=0; high:Integer=-1; k:Cardinal=$80000000; c:Cardinal=1);

var

  i,j,x: Integer;

begin

  if high = -1 then high := Length(arr) -1;

  i := low;

  j := high;

  while (i < j) do

  begin

    while (arr[j] and k <> 0) and (i < j) do Dec(j);

    while (arr[i] and k = 0) and (i < j) do Inc(i);

    if i < j then

    begin

      x := arr[j];

      arr[j] := arr[i];

      arr[i] := x;

    end else begin

      if arr[j] and k <> 0 then Dec(i) else Inc(j);

      Break;

    end;

  end;

  if k > c then

  begin

    if low < i then IntSort(arr, low, i, k div 2);

    if j < high then IntSort(arr, j, high, k div 2);

  end;

end;



{ }

procedure TForm1.Button1Click(Sender: TObject);

var

  MyArr: TIntArr;

  i: Integer;

  t: Int64;

begin

  SetLength(MyArr, MAXWORD);

  for i := Low(MyArr) to High(MyArr) do MyArr[i] := Random(MaxInt);

  

  t := GetTickCount;

  

  IntSort(MyArr); // 

  

  Text := IntToStr(GetTickCount - t);



  Memo1.Clear;

  for i := 0 to Length(MyArr)-1 do

  begin

    if i mod 1000 = 0 then

      Memo1.Lines.Add(IntToStr(MyArr[i]));

  end;

end;



procedure TForm1.FormCreate(Sender: TObject);

begin

  Memo1.Clear;

  Memo1.Align := alLeft;

  Memo1.ScrollBars := ssVertical;

end;



end.