SleepSort (JustForFun)

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

SleepSort (JustForFun)

Beitrag von m.fuchs »

Hallo,

heute bin ich in diesem Blogartikel (https://www.hostblogger.de/blog/archive ... psort.html) über das SleepSort-Verfahren gestolpert und war so begeistert, dass ich gleich eine FPC-Varianten davon implementiert habe. Die ich euch natürlich nicht vorenthalten möchte:

Code: Alles auswählen

program SleepSort;
{$MODE ObjFpc}
{$H+}
 
uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}CThreads,{$ENDIF}{$ENDIF}
  Classes, SysUtils;
 
type
  TSleepSortThread = class(TThread)
    private
      Value: Integer;
    protected
      procedure Execute; override;
    public
      constructor Create(AValue: Integer);
  end;
 
procedure TSleepSortThread.Execute;
begin
  Sleep(Value * 1000);
  WriteLn(Value);
end;
 
constructor TSleepSortThread.Create(AValue: Integer);
begin
  inherited Create(False);
  Self.FreeOnTerminate := True;
  Value := AValue;
end;
 
procedure SleepSort(Integers: array of Integer);
var
  Element, Highest: Integer;
begin
  Highest := 0;
  for Element in Integers do begin
    TSleepSortThread.Create(Element);
    if Element > Highest then Highest := Element;
  end;
  Sleep((Highest * 1000) + 250);
end;
 
begin
  SleepSort([9, 12, 1, 4, 3, 7]);
end.
Das Prinzip ist recht einfach. Für jede Zahl N aus dem Array wird ein Thread gestartet, der N Sekunden wartet und dann die Zahl ausgibt. Damit sind sie in aufsteigender Reihenfolge sortiert.

Besonders effizient ist das natürlich nicht und im praktischen Einsatz kann es durchaus mal schiefgehen (falls die Threads sich gegenseitig überholen). Als Spielerei aber ganz nett.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Antworten