Wer kann mir folgenden Source-Code erklären? [Java}

M

Michi09

Mitglied
Thread Starter
Dabei seit
28.04.2009
Beiträge
16
Reaktionspunkte
0
Also eins vorneweg: dass es ein Sortierverfahren ist, weiß ich, und dass es in diesem Forum "nur" um Webprogrammierung geht, auch. Vielleicht kennt ihr euch allerdings trotzdem ein wenig mit Java aus ;)

Was bedeuten die eckigen Klammern, wofür steht "array.length", wozu ist das "%"-Zeichen gut, u.v.m.

public void Shell_Sort(int[] array) {
int t = 0;
if (array.length % 2 == 0)
t = array.length >> 1;
else
t = (array.length >> 1) + 1;

while (t >= 1) {
for (int i = t,temp = 0; i < array.length; i++) {
for (int j = i - t; j >= 0; j =j - t) {
if (array[j] > array[j + t]) {
temp = array[j];
array[j] = array[j + t];
array[j + t] = temp;
}
}
}
if (t == 1)
break;
if (t % 2 == 0)
t = t >> 1;
else
t = (t >> 1) + 1;
}
}



Ich bedanke mich im vorraus ! :)
Gruß
Michi09
 
[] steht halt für ein array, der funktion wird mit int[] ein integer array übergeben.
array.length ist halt die größe des array.
% steht für modulo division, damit will der feststellen, ob die größe gerade oder ungerade ist.
>> 1 ist right shift um 1, im dem fall teilt es halt um 2. der right shift ist meistens schneller als eine division.
 
Ohne jetzt den Code gelesen zu haben, nur die Erklärung für die Sachen, die du explizit gefragt hast:
int[] bezeichnet ein Array, welches Daten vom Typ int (Integer) enthält.
% ist ein Operator wie /, +, - oder *. Steht für Modulo und gibt dir den Rest aus, der bei der ganzzahligen Divison bleibt. Also 5 % 2 wäre z.B. 1, da 5/2=2 ist mit Rest 1.
array.lenght liefert dir die länge des Arrays zurück, also wie viele Elemente es enthält. Wohlbemerkt beginnt die Nummerierung der Elemente bei 0 und geht bis Länge des Arrays - 1.

Hoffe das hilft dir schonmal ;)
 
Danke, ihr beiden habt mir sehr geholfen.
Sind die ersten Zeilen so richtig übersetzt?
Wenn die Array-Länge/2 keinen Rest hat, dann wird t um eine Stelle nach Rechts verschoben
andernfalls wird t um 2 nach rechts verschoben,
solange t größer/gleich 1 ist.


Und was bedeuten jetzt genau die for-Schleifen?
mfg,
Michi09
 
da findet das tauschen statt.
such doch einfach mal bei google nach einer grafischen darstellung von shellsort...
 
Na grafisch kann man sich das ja mithilfe einer Matrize erklären (laut Wiki). Das habe ich auch verstanden.
Mir machen (sollte ich doch tatsächlich den anfang richtig übersetzt haben) nur die Schleifen jetzt noch Probleme :(
 
Shellsort kenne ich persönlich leider nicht, sprich kann ihn dir auch nicht erklären. Aber vielleicht hilft's dir, wenn ich versuche zu verdeutlichen, was genau die Schleifen bewirken (soweit wie ich es jedenfalls verstehe):
die erste for-Schleife sorgt dafür dass das ganze Array durchlaufen wird und mit jedem Element, die innere for-Schleife durchlaufen wird.
Die innere Schleife geht dann das Array durch und vergleicht die Elemente miteinander und tauscht bei Bedarf.

Vielleicht hilft dir das. Besser versteh ich es gerade auch nicht, da mir Shellsort nicht geläufig ist ;)
 
Ich hab meine Übersetzung bisher folgendermaßen:
Wenn die Array-Länge geteilt durch 2 keinen Rest hat, dann wird t um eine Stelle nach Rechts verschoben
andernfalls wird t um 2 nach rechts verschoben,
bis t größer bzw. gleich 1 ist

jetzt zu den Schleifen

i hat den Anfangswert t,temp, also Null; bis i < array.länge ist; soll i mit 1 addiert werden {
j hat den Anfangswert i-t; bis j>=0 ist; soll t von j abgezogen werden{
wenn das Array mit der länge j > als das Array mit der länge j+t ist, dann {
temp(?) = das Array mit der länge j;
das Array mit der länge j = Array mit der länge j + t (verstehe ich nicht so recht ^^)
Array mit der länge j + t = temp;
}
}
}
wenn t = 1 ist
break;
wenn t durch 2 keinen Rest hat
wird t um 1 nach rechts verschoben
andernfals wird t um 2 nach rechts verschoben
}
}

ich bezweifle, dass es richtig ist, aber dafür bin ich ja hier
berichtig mit!
mfg
Michi09
 
array bzw. array[j] liefert dir nicht ein Array mit der Länge i bzw. j sondern liefert dir aus dem Array mit dem gerade gearbeitet wird (name ist "array") den jeweiligen Datensatz an der stelle i bzw. j ;)
 
Ah, dann verstehe ich die erste schleife schonmal auf jeden Fall ^^
und i-t ist dann wahrscheinlich der Rest der zu prüfenden Stellen, nicht wahr? Den letzten punkt der inneren Schleife verstehe ich dann aber nicht :(
Der Rest des Codes müsste dann aber folgendermaßen gehen:
Wenn das Array an der Stelle j größer als an der Stelle j+t ist{
dann ist temp(?) das array an der Stelle j;
Array an der stelle j = array an der stelle j+t;
array an der Stelle j+t ist temp;
}
}
}
...


Oh man, das ist vielleicht ein Kauderwelsch ^^
 
(1) Du kannst das code-Tag nutzen, dann wird alles etwas lesbarer

(2) Wir haben noch ein Entwicklerforum und da gehört die Frage wohl besser hin. Ich verschiebe mal

(3) Ich empfehle Dir eine Lektüre, z.B. der Java-Insel: http://openbook.galileocomputing.de/javainsel8/

:)
 
Interessant, bisher kannte ich nur Merge-, Quick-, Bucket-, Bubble-, Heap-, Radix- und Selectionsort. Aber dass es noch mehr gibt, hätte man sich ja eigentlich denken können :)
 
Zurück
Oben Unten