Hallo zusammen,
ich steh gerade etwas auf dem Schlauch. Arbeite schon seit Stunden an einem Kryptoanalysetool in Delphi und habe gerade eine Problemstellung, für die ich keine Lösung finde.
Ich habe ein Array A, das Kommawerte enthält:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| A[1] = 0.7 A[2] = 1.3 A[3] = 7.8 A[4] = 4.4 A[5] = 2.7 A[6] = 3.9 A[7] = 1.7 A[8] = 9.6 A[9] = 3.3 |
Nun möchte ich ein Array B erstellen, das ebenfalls die Schlüssel 1 bis 9 hat und als Werte die Schlüssel aus Array A, nach folgendem Schema: B[1] soll den Schlüssel K mit dem höchsten A[K] enthalten, B[9] den Schlüssel K mit dem niedrigsten A[K].
Das sähe dann anhand des obigen Beispiels folgendermaßen aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| B[1] = 8 B[2] = 3 B[3] = 4 B[4] = 6 B[5] = 9 B[6] = 5 B[7] = 7 B[8] = 2 B[9] = 1 |
Meine Idee war, ein temporäres Array T zu erstellen, das zunächst mit den gleichen Schlüsseln und Werten wie A gefüllt und dann mit BubbleSort absteigend sortiert wird (die ursprünglichen Schlüssel entfallen).
Dann wiederum eine Schleife:
Quelltext
1: 2: 3: 4: 5: 6:
| i := 1; while i <= 9 do begin B[i] := getKeyByValue(A, T[i]); inc(i); end; |
getKeyByValue ist eine eigene Funktion und liefert in diesem Fall aus dem Array A den Schlüssel K mit A[K] = T[i] zurück.
Das funktioniert prinzipiell sogar, allerdings nur solange im Array A keine Werte doppelt auftreten:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| Aus A[1] = 0.7 A[2] = 0.5 A[3] = 0.5
wird B[1] = 1 B[2] = 3 B[3] = 3 |
Ich brauche es aber so, dass alle Schlüssel zurückgeliefert werden, auch bei gleichen Werten:
Quelltext
1: 2: 3:
| B[1] = 1 B[2] = 2 B[3] = 3 |
oder meinetwegen auch
Quelltext
1: 2: 3:
| B[1] = 1 B[2] = 3 B[3] = 2 |
Die Reihenfolge spielt dabei keine Rolle. Es müssen nur alle Schlüssel des Arrays einmal auftauchen. Wie setze ich das am besten um?
Vielen Dank im Voraus!
xenilio