![]() |
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:
Ich muss erklären [procedure ShellSort(var aSort: array of integer)], wie der Algo funktioniert bzw. aufdgebaut ist, kann mir jemand helfen? :glaskugel:
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. |
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 ![]() Dein Code wird wahrscheinlich nicht anders arbeiten. Grüße Klaus |
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...
|
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.
|
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:
|
Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo
Zitat:
![]() |
Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo
Bei mir ist der Link dead :gruebel:
|
Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo
Mist, das war ein interner Link. Aber das war gemeint:
![]() |
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? |
Re: Brauche Hilfe bei Sourcecode von Shellsort-Sortieralgo
Delphi-Quellcode:
ist das soweit richtig?
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; [edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen :) Mfg, SirThornberry[/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz