Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Sortierverfahren
nixchecker - So 19.01.03 10:38
Titel: Sortierverfahren
Hallo, ich habe ein kleines Problem: ich muss in Informatik das Sortierverfahren "shakersort" vorstellen. Im Internet habe ich dazu nichts gescheites gefunden (oder ich kapiere es nicht, bin nämlich eine Null in Informatik).
Kann mir jemand von euch dieses Verfahren bitte erklären? Oder habt ihr schon ein Programm mit Shakersort geschrieben, das ihr mir geben könnt?
Tausend dank!
nixchecker - So 19.01.03 11:05
Da hast du ewas falsch verstanden. Ich will nicht, dass es jemand anderes für mich macht !!!
Ich habe wohl schon mit google gesucht, aber nichts brauchbares gefunden. Entweder irgendwelche Quelltexte, die ich nicht verstehe, oder etwas allegemeines.
Bis jetzt weiß ich nur, dass Shakersort ähnlich wie bubblesort funktioniert.
Zu meinem konkretten Anliegen:
Ich muss 5 Zahlen aus editfenstern auslesen (das kann sogar ich :D ),
und diese dann sortieren und in ein neues Editfenster einfügen (das ist das Problem).
Ich weiß nur, dass ich irgendwie etwas mit einer Schleife machen muss, mehr checke ich nicht.
Daher habe ich ja auch gefragt, ob jemand ein fertiges Programm hat, dann könnte ich mir das entsprechende rauskopieren, ansehen, und meine Fragen dazu stellen.
Das Referat (nur eine Kurzvorstellung) muss bis Mittwoch fertig sein (habe diesen Mittwoch bescheid gekriegt)
bis11 - So 19.01.03 11:07
Hi,
die beiden Links die ich Dir gepostet habe, habe ich mit Google gefunden. Unter diesen Links befinden sich auch Quelltexte. Einfach durch rauskopieren lernt man nichts. Den größten Lerneffekt erziehlst Du wenn Du es selber ausprobierst. Das nur als kleiner Tipp nebenher.
Poste doch einfach mal Deinen Versuch, dann kann man Dir sagen, wo Du einen Fehler gemacht hast.
nixchecker - So 19.01.03 11:15
Gut dann stelle ich mal meine Frage zu diesem Quelltext:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TForm1.ShakerSort(Sender:TObject); var h:array[1..100] of byte; j,k,l,r:byte; begin ... l:=2; r:=100; k:=100; repeat for j:=r downto l do begin if h[j-1]>h[j] then begin tauschen(h[j-1],h[j]); k:=j; end; end; l:=k+1; for j:=l to r do begin if h[j-1]>h[j] then begin tauschen(h[j-1],h[j]); k:=j; end; end; r:=k-1; until l>r; end; |
1.) muss ich byte nehmen (hatten wir noch nie)
2.) sind j,k,l,r meine Variablen? Dann müsste ich doch statt ...
l:=2;
r:=100;
k:=100; meine Editfenster auslesen?
3.) wie sieht es dann mit dieser Zeile aus?
for j:=r downto l do begin
ich weiß ja gar nicht, welches die größte und welches die kleinste Zahl ist?
4.) was soll das:
if h[j-1]>h[j]
5.) gibt es diesen Befehl wirklich:; tauschen(h[j-1],h[j]); oder muss ich den erst erfinden? (wenn ja wie)
6.) warum ist k:=j;?
7.) und die Fragen gehen weiter, aber vielleicht erledigen sich die nächsten fragen, wenn ich die obigen kapier
Moderiert von
Tino: Code-Tags hinzugefügt.
grayfox - So 19.01.03 11:40
hallo nixchecker!
1) kommt drauf an, wie gross die zahlen sind, die du sortieren willst.
sind sie kleiner als 255, dann reicht byte. ich würde LongInt nehmen, sicher ist sicher :)
2) bitte sprechende variblen machen. der quelltext wird dadurch leichter verständlich und du verstehst auch nach ein paar monaten noch, was in den variablen drinnensteht
was sind 'editfenster'? das hatte ich noch nie
3) die schleife wird vom letzten eintrag bis zum 2. rückwärts durchlaufen
4)
ist der vergleich der vorigen mit der nächsten zahl
ins
h gehört deine zahl,
j ist ein zähler
5)
tauschen ist der name einer prozedur...
dort wird der nachfolger mit dem vorgänger vertauscht. sie gehört programmiert und nicht erfunden *gg*
6) ich vermute, dass
k anzeigt, wie weit er schon sortiert hat...
mfg, stefan
bis11 - So 19.01.03 11:46
Hi,
diese Procedure sortiert Dir die Zahlen in einem Array.
Um Dir mal ganz kurz zu erklären, wie das Shakersort funktioniert :
Shakersort ist eine Abschlag von Bubble-Sort. Bei Shakersort wird der Array von der ersten bis zur letzten Zahl durchgegangen und ermittelt welche die größte und welches die kleinste ist. Beim ersten Durchlauf wird von oben nach unten angefangen und beim zweiten Durchlauf von unten nach oben. Dadurch entstand der Namen.
| Zitat: |
was soll das:
if h[j-1]>h[j]
|
Da wird nur überprüft ob in dem Array H die Position J-1 größer ist als die Position J.
| Zitat: |
wie sieht es dann mit dieser Zeile aus?
for j:=r downto l do begin
ich weiß ja gar nicht, welches die größte und welches die kleinste Zahl ist?
|
Diese FOR-Schleife durchgeht das Array H von der letzten Position durch bis zu der zweiten Position.
Tauschen ist eine eigene Funktion, worin das Array in der entgegengesetzen Richtung durchlaufen wird.
Ich hoffe das hilft dir erstmal weiter. Jetzt probiere die Funktion erstmal aus. Denn wenn ich Dir jetzt die ganze Funktion Zeile für Zeile erklären würde, lernst Du nicht viel dabei. Einen kleinen Tipp noch am Schluß, gehe mal das Programm im einzelschritt durch und lasse Dir dabei den Status der einzelnen Variablen anzeigen, damit Du die Zahlen besser nachvollziehen kannst.
nixchecker - So 19.01.03 11:56
Danke für eure Hilfe, so weit bin ich jetzt gekommen:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| begin a:=StrToInt(edit1.text); b:=StrToInt(edit2.text); c:=StrToInt(edit3.text); d:=StrToInt(edit4.text); e:=StrToInt(edit5.text);
repeat for a:=hilfsvari downto e do begin if h[a-1]>h[a] then begin tauschen(h[a-1],h[a]); |
Stimmt das so weit? Bisher bekomme ich nur den Fehler, dass Tauschen ein undefinierter Bezeichner ist. Wie definiere ich tauschen?
Stimmt meine for-schleife?
Moderiert von
Tino: Code-Tags hinzugefügt.
bis11 - So 19.01.03 12:30
Hi,
du schreibst Deine einzelnen Werte in einzelne Variablen, das geht nicht. Du mußt die Werte in ein Array schreiben.
Tauschen ist eine Funktion, die Du noch selber schreiben mußt.
nixchecker - So 19.01.03 12:39
Und wie mache ich das? Heißt das, dass a,b,c,d,e Arrays werden müssen?
Tut mir leid ich checke das gerade auf keinem Auge, und bin total am Verzweifeln.
bis11 - So 19.01.03 12:47
Arrays sind Bereiche, wo mehrere Werte oder Zeichenketten dirnstehen können. Beispiel :
Quelltext
1:
| zahlen : array[1..100] of integer; |
In der Variable Zahlen können nun 100 verschiedene Werte gespeichert werden. Die Du nun so wieder abrufen kannst :
Quelltext
1:
| Label1.Caption := IntToStr(zahlen[5]); |
Soviel zu dem kurzen Crash-Kurs. Ich empfehle Dir noch folgende Einsteigertutorials von dieser Seite unter Tutorials und von der Seite
http://www.delphi-source.de
smiegel - So 19.01.03 12:53
Hallo,
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| procedure Tauschen(var Tausch1, Tausch2:Integer); var merk:Integer; begin merk:=Tausch1; Tausch1:=Tausch2; Tausch2:=merk; end; // Tauschen
type MySortArray:array[1..5] of Integer;
procedure TForm1.Sortiere; var i,j:Integer; sort:MySortArray; begin FillChar(sort, SizeOf(MySortArr), 0); for i:=1 to 5 do sort[i]:=StrToInt(TEdit(FindComponent('Edit'+IntToStr(i))).Text); for i:=5 downto 2 do for j:=4 downto 1 do if (sort[i]>sort[j]) then Tauschen(sort[i], sort[j]); end; // TForm1.Sortiere |
Alle Angaben ohne Gewehr;-)
Ob das obigen Sortierverfahren ShakerShort ist, weiss ich nicht, da ich das Sortierverfahren nicht kenne. Aber vom Prinzip her, müsste es stimmen.
nixchecker - Mi 29.01.03 19:36
So, dasss Thema hat sich erledigt. Ich habe das Referat nicht gehalten
Tino - Do 30.01.03 09:28
Trotzdem Danke an die die geholfen haben :-)
Gruß
TINO
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!