Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo (https://www.delphipraxis.net/140839-brauche-hilfe-bei-sourcecode-von-shellsort-sortieralgo.html)

Andy5050 27. Sep 2009 08:25


Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo
 
Tachchen erstmal, ich bin neu hier.

Ich hatte mit einem Freund den Auftrag ein Programm zum Sortieralgo "Shellsort" zu schreiben.
Da das nicht so geklappt hat als geplant, haben wir einen aus dem Netz genommen. (Wurde akzeptiert)

--> Shellsort: Bei Shellsort wird die Reihe der Elemente (z.B: 9 3 2 8 7 5 6 1) in Pakete unterteilt --> 9 3 | 2 8 | 7 5 | 6 1

Diese werden dann (nur um es anschaulich zu machen)untereinander geschrieben, also
9 3
2 8
7 5
6 1
dann werden die Zahlen spaltenweise mit Insertionsort sortiert:

3 9 2 8 5 7 6 1 dies wird mit "größeren" Paketen wiederholt, also 3 9 2 8 | 5 7 6 1 usw..

Hier der Code:

Delphi-Quellcode:
unit uSortieren;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Menus, StdCtrls,Math, ExtCtrls;

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    Memo1: TMemo;
    Memo2: TMemo;
    Datei1: TMenuItem;
    Laden1: TMenuItem;
    Speichern1: TMenuItem;
    Schlieen1: TMenuItem;
    Sortieren1: TMenuItem;
    Heapsort1: TMenuItem;
    Mergesort1: TMenuItem;
    Sehllsort1: TMenuItem;
    Neu1: TMenuItem;
    Extras1: TMenuItem;
    Zufallszahlen1: TMenuItem;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Memolschen1: TMenuItem;
    procedure Sehllsort1Click(Sender: TObject);
    procedure Laden1Click(Sender: TObject);
    procedure Speichern1Click(Sender: TObject);
    procedure Neu1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  a : array of integer;

const hoehe = 200;
implementation

{$R *.dfm}

procedure Delay(dwMilliseconds: Longint);
var
  iStart, iStop: DWORD;
begin
  iStart := GetTickCount;
  repeat
    iStop := GetTickCount;
    Application.ProcessMessages;
  until (iStop-iStart) >= dwMilliseconds;
end;

procedure ZeichneVisu(a : array of integer);
var
i :integer;
begin
with Form1.Image1 do
begin
Canvas.Brush.Color := clWhite;
Canvas.Rectangle(0,0,Width,height);
Canvas.Brush.Color := clSkyBlue;
for i := 1 to length(a) do
  begin
    Canvas.Rectangle((i-1)*18+3,Height-ceil(Height/(Hoehe/a[i]))+2,(i-1)*18+13,Height);
  end;
end;
end;

procedure ShellSort(var aSort: array of integer);
var
  iI, iJ, iK,
  iSize: integer;
  wTemp: integer;
begin
  iSize := High(aSort);
  iK := iSize shr 1;
  while iK > 0 do
  begin
    for iI := 0 to iSize - iK do
    begin
      iJ := iI;
      while (iJ >= 0) and (aSort[iJ] > aSort[iJ + iK]) do
      begin
        wTemp := aSort[iJ];
        aSort[iJ] := aSort[iJ + iK];
        aSort[iJ + iK] := wTemp;
        if iJ > iK then
          Dec(iJ, iK)
        else
          iJ := 0 ;
        ZeichneVisu(a);
        Delay(50);
      end;
    end;
    iK := iK shr 1;
  end;
  end;

procedure TForm1.Speichern1Click(Sender: TObject);
begin
 if saveDialog1.execute
  then begin
         memo1.Lines.savetofile(saveDialog1.filename);
         end;
end;

procedure TForm1.Sehllsort1Click(Sender: TObject);
var
i : integer;
begin
SetLength(a,Memo1.Lines.Count);
for i := 0 to Memo1.Lines.Count -1 do a[i] := strtoint(Memo1.Lines[i]);
ShellSort(a);
for i := 0 to high(a) do Memo2.Lines.Add(inttostr(a[i]));
end;

procedure TForm1.Laden1Click(Sender: TObject);
begin
  if openDialog1.execute
  then begin
         memo1.Lines.loadfromfile(openDialog1.filename);
         end;
end;

procedure TForm1.Neu1Click(Sender: TObject);
begin
memo1.lines.Clear;
memo2.lines.Clear;
end;

end.
Ich muss erklären [procedure ShellSort(var aSort: array of integer)], wie der Algo funktioniert bzw. aufdgebaut ist, kann mir jemand helfen? :glaskugel:

Klaus01 27. Sep 2009 09:17

Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo
 
Guten Morgen,

über den ShellSort Algorithmis ist im Web (wenn man Tante Google bemüht)
recht viel zu finden.
Eine kurze und verständliche Erklärung findest Du hier.
Dein Code wird wahrscheinlich nicht anders arbeiten.

Grüße
Klaus

Andy5050 27. Sep 2009 14:55

Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo
 
Danke für den Tip, das geht aber etwas an meiner Frsge vorbei... Ich muss den Shellsort-kern, den ich hier rein geschrieben habe, (zeilenweise) erklären können. Da ich im Programmieren ne totale Niete bin, bräuchte ich dabei Hilfe z.B: wofür die VARs stehen, was der Befehl "shr" bedeutet usw. Wenn mir dabei jemand helfen könnte...

Luckie 27. Sep 2009 15:07

Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo
 
Die Befehle kannst du alle in der Hilfe nachschlagen und dann sollte es kein allzu großes Problem sein den Code zu verstehen.

Andy5050 27. Sep 2009 15:11

Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo
 
Ich hab delphi selber nicht... außerdem versteh ich den ganzen Aufbau net, ich hab ja gesagt, ich bin ne Niete im programmieren.. :wall:

Luckie 27. Sep 2009 15:22

Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo
 
Zitat:

Zitat von Andy5050
Ich hab delphi selber nicht... außerdem versteh ich den ganzen Aufbau net, ich hab ja gesagt, ich bin ne Niete im programmieren.. :wall:

Brauchst du auch nicht: http://www.delphipraxis.net/internal...t.php?t=165648 ;)

Andy5050 27. Sep 2009 15:27

Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo
 
Bei mir ist der Link dead :gruebel:

Luckie 27. Sep 2009 15:38

Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo
 
Mist, das war ein interner Link. Aber das war gemeint: http://ref.dp200x.de/

Andy5050 27. Sep 2009 15:50

Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo
 
"x shr 1 macht x/2 ohne Rest "

--> iK := iSize shr 1; das bedeutet also, das iK das mittlere Element bzw. das was links der mitte steht ist und iSize das letzte element ist,oder?

Andy5050 28. Sep 2009 07:52

Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo
 
Delphi-Quellcode:
procedure ShellSort(var aSort: array of integer);
var
  iI, iJ, iK, iSize: integer;     // Deklaration der VARiablen//   
  wTemp: integer;
begin
  iSize := High(aSort);       // iSize ist die Menge aller Elemente im Array//
  iK := iSize shr 1;          // iK ist das mittlere Element//
  while iK > 0 do
  begin
    for iI := 0 to iSize - iK do // iI sind die Werte links von iK// 
    begi
      iJ := iI;              // iJ sind die zu sortierenden Werte// 
      while (iJ >= 0) and (aSort[iJ] > aSort[iJ + iK]) do
      begin
        wTemp := aSort[iJ];
        aSort[iJ] := aSort[iJ + iK];
        aSort[iJ + iK] := wTemp;
        if iJ > iK then
          Dec(iJ, iK)  // Die
        else
          iJ := 0 ;
        ZeichneVisu(a);
        Delay(50);
      end;
    end;
    iK := iK shr 1;
  end;
  end;
ist das soweit richtig?

[edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen :) Mfg, SirThornberry[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:18 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