TIA Reihenfolge der Elemente eines Arrays bestimmen

SebastianR

Level-2
Beiträge
13
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
kennt jemand einen Baustein/Lösung, um folgendes zu realisieren?

Ich habe ein Array [1;5;3;8;2] und möchte wissen an welcher Index-Positionen die Elemente in aufsteigender Reihnefolge stehen. Ergebnis für mein Beispiel-Array wäre [0;4;2;1;3].

Danke für Ideen und Anregungen!
 
Das ist eine SortierAufgabe, bei der man die Massen an Daten dort belässt, wo sie sind und stattdessen nur die Indizes auf die DatenElemente "sortiert".
Um das Sortieren kommst Du nicht herum, lediglich um das Umschaufeln der zu sortierenden Daten.
Dazu benötigst Du entweder ein 2. Array für die Indizes, oder Du erweiterst Dein Array um eine weitere "Spalte", die Du dafür "missbrauchst".
Wenn Dein Index und Deine Daten unterschiedliche Datentypen erfordern, würde ich mich für ein Array of Struct entscheiden.

Gruss, Heinileini

PS:
Beispiel in VBA unter EXCEL:
Code:
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Type Sort
    Idx As Long
    Dat As String
End Type
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sub Test()
Dim a(6) As Sort
' Daten aus TabellenBlatt (B5:B11) einlesen und Indizes vorbesetzen:
For i& = LBound(a) To UBound(a)
    a(i&).Idx = i&
    a(i&).Dat = Cells(5 + i&, 2).Value
    Next i&
' Sotieren:
xM& = -1
xA& = LBound(a): xE& = UBound(a)
xS& = xA&
Do While xM&
    xM& = 0
    Do While xS& < xE&
        If a(a(xS&).Idx).Dat > a(a(xS& + 1).Idx).Dat Then xTmp& = a(xS&).Idx: a(xS&).Idx = a(xS& + 1).Idx: a(xS& + 1).Idx = xTmp&: xM& = -1
        xS& = xS& + 1
        Loop
    xE& = xE& - 1
    xS& = xE& - 1
    Do While xS& >= xA&
        If a(a(xS&).Idx).Dat > a(a(xS& + 1).Idx).Dat Then xTmp& = a(xS&).Idx: a(xS&).Idx = a(xS& + 1).Idx: a(xS& + 1).Idx = xTmp&: xM& = -1
        xS& = xS& - 1
        Loop
    xA& = xA& + 1
    xS& = xA&
    Loop
' Dump im DirektFenster:
Debug.Print
For i& = LBound(a) To UBound(a)
Debug.Print a(i&).Idx, a(i&).Dat, a(a(i&).Idx).Dat
    Next i&
End Sub
Ausgabe im DirektFenster:
0 1 1
4 5 2
2 3 3
1 8 5
3 2 8
6 X A
5 A X
Die ersten 5 Elemente sind aus Deinem Beispiel, ich habe für den Test 2 Elemente hinzugefügt: X und A

Oder - angewendet auf Deinen Satz:
Code:
  3    Ich               Array
 19    habe              Beispiel-Array
 11    ein               Elemente
 16    Array             Ergebnis
  0    und               Ich
  9    möchte            Index-Positionen
 14    wissen            Reihnefolge
  7    an                an
 13    welcher           aufsteigender
 10    Index-Positionen  die
  2    die               ein
 17    Elemente          für
  1    in                habe
 12    aufsteigender     in
 18    Reihnefolge       mein
  5    stehen            möchte
 15    Ergebnis          stehen
  4    für               und
  8    mein              welcher
  6    Beispiel-Array    wissen
 20    wäre              wäre
 
Zuletzt bearbeitet:
Zurück
Oben