AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo
Thema durchsuchen
Ansicht
Themen-Optionen

Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo

Ein Thema von Andy5050 · begonnen am 27. Sep 2009 · letzter Beitrag vom 28. Sep 2009
Antwort Antwort
Andy5050

Registriert seit: 27. Sep 2009
6 Beiträge
 
#1

Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo

  Alt 27. Sep 2009, 08:25
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?
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo

  Alt 27. Sep 2009, 09:17
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
Klaus
  Mit Zitat antworten Zitat
Andy5050

Registriert seit: 27. Sep 2009
6 Beiträge
 
#3

Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo

  Alt 27. Sep 2009, 14:55
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...
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo

  Alt 27. Sep 2009, 15:07
Die Befehle kannst du alle in der Hilfe nachschlagen und dann sollte es kein allzu großes Problem sein den Code zu verstehen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Andy5050

Registriert seit: 27. Sep 2009
6 Beiträge
 
#5

Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo

  Alt 27. Sep 2009, 15:11
Ich hab delphi selber nicht... außerdem versteh ich den ganzen Aufbau net, ich hab ja gesagt, ich bin ne Niete im programmieren..
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo

  Alt 27. Sep 2009, 15:22
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..
Brauchst du auch nicht: http://www.delphipraxis.net/internal...t.php?t=165648
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Andy5050

Registriert seit: 27. Sep 2009
6 Beiträge
 
#7

Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo

  Alt 27. Sep 2009, 15:27
Bei mir ist der Link dead
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo

  Alt 27. Sep 2009, 15:38
Mist, das war ein interner Link. Aber das war gemeint: http://ref.dp200x.de/
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Andy5050

Registriert seit: 27. Sep 2009
6 Beiträge
 
#9

Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo

  Alt 27. Sep 2009, 15:50
"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?
  Mit Zitat antworten Zitat
Andy5050

Registriert seit: 27. Sep 2009
6 Beiträge
 
#10

Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo

  Alt 28. Sep 2009, 07:52
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]
  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 00:34 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