「Sleep sortの各言語での実装まとめ – Yuyak」にDelphiによる実装がなかったので挑戦してみた。
# Delphiは初心者はのであまり自信がない。
Sleep sortについては、「常識を覆すソートアルゴリズム!その名も"sleep sort"! – Islands in the byte stream」をご覧ください。
実行方法は、プログラムの引数にソートする値を与える。
Project1.exe 1 3 5 2 4
ソースコード
uses
SysUtils, Classes, Generics.Collections;
type
{個々の要素の遅延表示を行うスレッド}
TSleepSortThread = class(TThread)
private
FNumber: Integer;
protected
procedure Execute; override;
public
constructor Create(Number: Integer); overload;
end;
constructor TSleepSortThread.Create(Number: Integer);
begin
FNumber := Number;
inherited Create(False); { 引数のFalseは「スレッドをすぐに実行する」 }
end;
procedure TSleepSortThread.Execute;
begin
inherited;
{ Sleepの引数はミリ秒なので1000をかける }
Sleep(FNumber * 1000);
{ Writelnは排他処理が必要かもしれない }
Writeln(FNumber);
end;
procedure SleepSort;
var
I: Integer;
ThreadList: TObjectList<TSleepSortThread>;
Thread: TSleepSortThread;
begin
ThreadList := TObjectList<TSleepSortThread>.Create(True);
{ スレッドを作成して順次実行する }
for I := 1 to ParamCount do { ParamCount(0)はプログラム名なので1から始める}
begin
ThreadList.Add(TSleepSortThread.Create(StrToInt(ParamStr(I))));
end;
{ すべてのスレッドが終了するまで待機する }
for Thread in ThreadList do Thread.WaitFor;
ThreadList.Free; { TObjectListはリストの要素を破棄する }
end;
begin
try
SleepSort();
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
Pingback: Sleep sortの各言語での実装まとめ – Yuyak