Guten Tag,
ich habe hier einen Sortieralgorithmus (bubble sort).
Dieser Sortiert die Elemente eines Arrays von klein nach groß.
Gibt es eine Möglichkeit den Algo so zu erweitern, dass man die alte
Position des Eintrags, also den alten Index merkt?
Es soll folgendes möglich sein:
Index: 0 1 2
Array: 2 1 4
Nach dem sortieren:
Index: 1 0 2
Array: 1 2 4
Hier der Algorithmus:
Das ist ganz einfach. Du legst dir ein zweites Array an. Vor dem
Sortieren trägst du da die Zahlen von 0...n ein, sodass gilt
TheArray[n] = TheArray[IndexArray[n]]
logisch.
Beim Sortieren verfährst du wie üblich, nur dass du sowohl den Eintrag
im TheArray als auch im IndexArray äquivalent tauschen musst. also
nehmen wir an du tauschst TheArray[i1] mit TheArray[i2], dann musst du
auch IndexArray[i1] mit IndexArray[i2] tauschen.
Bayer22 schrieb:> Hier der Code.. meintest du so? :)
Im Grunde ja.
Bei größeren Datensätzen geht man sogar soweit, dass man nur den Index
umsortiert und die Daten selber in Ruhe lässt.
D.h. das Datenarray bleibt so wie es war und wenn man die Daten in
sortierter Form haben möchte, dann greift man so
array[ AlterIndex[i] ]
darauf zu.
Karl Heinz Buchegger schrieb:> D.h. das Datenarray bleibt so wie es war
Also ich habe jetzt keine großen Datensätze aber heißt das, dass man das
Datenarray nicht per Pointer übergibt?
Die Information über das Datenarray muss ja im Sortieralgorithmus
vorhanden sein.
Samuel K. schrieb:> Ich würde Klassen sortieren, welche von IComperable abgeleitet sind. In> der Klasse wird der alte Index gespeichert.
Und jetzt bitte nochmals für einen Normalsterblichen! :)
Dachte das IComperable nur bei C# verwendet wird?
Grüße
Bayer22 schrieb:> Karl Heinz Buchegger schrieb:>> D.h. das Datenarray bleibt so wie es war>> Also ich habe jetzt keine großen Datensätze aber heißt das, dass man das> Datenarray nicht per Pointer übergibt?> Die Information über das Datenarray muss ja im Sortieralgorithmus> vorhanden sein.
Natürlich muss das Sortierverfahren die Daten kennen, wie soll sie die
denn sonst sortieren?
Aber sie verändert nun mal nicht die Daten selber, sondern nur den Index
Das ist die Ausgansgsituation.
Die Daten
+---+---+---+---+---+---+
| h | a | l | p | e | u |
+---+---+---+---+---+---+
dazu macht man sich einen Index
+---+---+---+---+---+---+
| h | a | l | p | e | u |
+---+---+---+---+---+---+
+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 |
+---+---+---+---+---+---+
und sortiert lediglich den Index so um
+---+---+---+---+---+---+
| h | a | l | p | e | u |
+---+---+---+---+---+---+
+---+---+---+---+---+---+
| 1 | 4 | 0 | 2 | 3 | 5 |
+---+---+---+---+---+---+
dass die Daten beim Zugriff über daten[ index[ i ] ]
eine sortierter Reihenfolge herauskommen.
Mit einer Schleife
for( i = 0; i < 6; ++i )
sprintf( "%c ", daten[index[i]] );
würde man erhalten
a e h l p u
index[0] ist 1, mit dieser 1 in die Daten: daten[1] ergibt nun mal a
index[1] ist 4, mit dieser 4 in die Daten: daten[4] ergibt nun mal e
etc
ergo:
Das Datenarray bleibt wie es war. Da wird nichts verändert. Aber man hat
über den Index einen 2-ten Zugriffsweg und wenn man den benutzt, dann
bekommt man die Daten sortiert geliefert.
Der Umbau des Sortierverfahrens ist trivial. Alle Zugriffe (für die
Vergleiche) werden bereits über das Index Array geführt und vertauscht
werden nur die Indices
Bayer22 schrieb:> Und jetzt bitte nochmals für einen Normalsterblichen! :)> Dachte das IComperable nur bei C# verwendet wird?
sry, ich war aus irgendeinem Grund beim Schreiben bei c#.
In c++ geht das sicher auch. Meine Idee war es jedem Element seinen
Index (oder ID) mitzuspeichern. Das ganze in einer Klasse kapseln und
den Index beim vergleichen außen vor lassen.
Wie man Klassen in c++ vergleicht weiß ich aber wirklich nicht. Brauchte
ich auch bisher noch nicht, da ich in c++ nur Spiele schreibe.