AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[Fun Code] Sleepsort

Ein Thema von Gloegg_FHBI · begonnen am 12. Nov 2012 · letzter Beitrag vom 12. Nov 2012
Antwort Antwort
Benutzerbild von Gloegg_FHBI
Gloegg_FHBI

Registriert seit: 28. Nov 2006
Ort: Neuss
46 Beiträge
 
Delphi 10 Seattle Professional
 
#1

[Fun Code] Sleepsort

  Alt 12. Nov 2012, 12:20
Ich bin letztens über einen "interessanten" Sortieralgorithmus gestolpert (http://dis.4chan.org/read/prog/1295544154). Diesen habe ich mal spasseshalber in Delphi implementiert.

Bitte nicht in Produktionscode benutzen!

Delphi-Quellcode:
program Sleepsort;

var
  items: TArray<integer>;
  i: integer;

begin
  randomize;
  writeln('Random: ');
  setlength(items, 25);
  for i := 0 to High(items) do
  begin
    items[i] := random(length(items) * 4);
    write(IntToStr(items[i]) + ' ');
  end;
  writeln;
  writeln('Sorted: ');
  for i := 0 to high(items) do
  begin
     TSortThread.Create(items[i]);
  end;
  readln;
end.
Delphi-Quellcode:
unit uSortThread;

interface

uses
  Classes;

type
  TSortThread = class (TThread)
  private
    fValue : integer;
  protected
    procedure Execute; override;
  public
    constructor Create(n : integer);
  end;

implementation

uses SysUtils;

constructor TSortThread.Create(n: integer);
begin
  inherited Create;
  fValue := n;
end;

procedure TSortThread.Execute;
begin
  sleep(fValue * 333);
  write(IntToStr(fValue)+' ');
end;

end.
Erst hatte ich versuch das mit anonymen Threads zu machen, aber das wollte nicht so recht klappen:
Delphi-Quellcode:
    TThread.CreateAnonymousThread(
      procedure
      begin
        sleep(items[i] * 333);
        write(IntToStr(items[i]) + ' ');
      end).Start;
Die anonyme Methode wird erst ausgeführt, nachdem die for-schleife verlassen wurde. i ist dann 25 und items[i] zeigt auf den Speicherbereich hinter dem array.
  Mit Zitat antworten Zitat
Benutzerbild von defede
defede

Registriert seit: 10. Aug 2006
Ort: Stötten am Auerberg
72 Beiträge
 
Delphi 7 Professional
 
#2

AW: [Fun Code] Sleepsort

  Alt 12. Nov 2012, 13:22
Hallo,
also ich würde von dieser "Sortierung" abraten. Man stelle sich nur mal vor man möchte damit 1,2,3,99999999 sortieren.
Alternativ ist das ganze auf jeden fall, nur wo finden sich hier Einsatzgebiete?
Invader Zim
Obey Zim
Fear Zim
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#3

AW: [Fun Code] Sleepsort

  Alt 12. Nov 2012, 13:44
Man schreibe das ganze statt in ein zeitbasiertes Array (Sleep) in ein normales Array. Danach hat man die Elemente auch in der richtigen Reihenfolge.

Delphi-Quellcode:
var
  Elems : Array [Minwert..Maxwert] of Nullable<Integer>; //gib es den?
  Temparray: Array [0..AnzWerte-1] of Integer;
begin
  for i:= Low(Elems) to High(Elems)
  begin
    TempArray[Elems[i]] := elem;
  end;
  for i:= Low(TempArray) to High(TempArray)
  begin
    if not TempArray[i] = nil then
      WriteLn(TempArray[i])
  end;
end.
Dem Wertebereich sind natürlich auch Grenzen gesetzt (Arraygröße), aber man muss nicht ganz solange warten (2 Durchläufe)
Delphi programming

Geändert von WM_CLOSE (12. Nov 2012 um 13:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: [Fun Code] Sleepsort

  Alt 12. Nov 2012, 13:59
Das funktioniert dann aber auch nur mit ganzen Zahlen und verbaucht ggf. ne Menge Speicher. Es ist auch (gefühlt) etwas langsamer als die Zeit-Variante (allerdings auch weniger fehleranfällig)
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#5

AW: [Fun Code] Sleepsort

  Alt 12. Nov 2012, 14:24
Lustige Idee
Damit bringt man vermutlich die Prozessverwaltung ins Schnaufen, denn im Grunde muss die dann das Sortieren übernehmen.

Richtig böse wird es, wenn das Durchlaufen der Eingabe länger dauert als eine typische Wartezeit. Also bräuchte man noch ein Synchronisationsmittel, um alle gleichzeitig zu starten.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#6

AW: [Fun Code] Sleepsort

  Alt 12. Nov 2012, 14:25
Delphi-Quellcode:
uses
  DSharp.Core.Nullable, // oder Spring
  SysUtils;

function Sort(const Values: array of Integer): TArray<Integer>;
var
  i, k: Integer;
  tmp: array of Nullable<Integer>;
begin
  k := 0;
  for i in Values do
    if i > k then
      k := i;
  SetLength(tmp, k + 1);
  SetLength(Result, Length(Values));
  for i in Values do
    tmp[i] := i;

  k := 0;
  for i := Low(tmp) to High(tmp) do
    if tmp[i].HasValue then
    begin
      Result[k] := tmp[i];
      Inc(k);
    end;
end;

var
  i: Integer;
begin
  for i in Sort([5, 3, 55, 35, 6]) do
  begin
    WriteLn(i);
  end;

  Readln;
end.
Problem im Gegensatz zum zeitbasierten Array ist, dass hier Werte nur einmal vorkommen dürfen.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
WM_CLOSE

Registriert seit: 12. Mai 2010
Ort: königsbronn
398 Beiträge
 
RAD-Studio 2009 Pro
 
#7

AW: [Fun Code] Sleepsort

  Alt 12. Nov 2012, 14:44
Problem im Gegensatz zum zeitbasierten Array ist, dass hier Werte nur einmal vorkommen dürfen.
Stimmt, das habe ich garnicht bedacht...
Delphi programming
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#8

AW: [Fun Code] Sleepsort

  Alt 12. Nov 2012, 14:56
Das Problem mit der Arrayvariante ist ja, dass man wegen der leeren Stellen exponentiell viel Platz (und damit auch Zeit) in der Eingabelänge braucht.

Wenn man dass mit einer intelligenteren Datenstruktur (Heap) vermiedet, kommt dass vernünftige Heapsort raus.
Insofern ist es nicht ganz so unsinnig wie Sleepsort.
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz