2017-04-12 4 views
5

Ich versuche, eine erste Lösung für das Problem des Gruppenausgleichs zu erstellen, aber ich scheine auf etwas festzuhalten, das klingt, als sollte es ziemlich einfach sein.Indizes der Elemente in der Reihenfolge vom kleinsten zum größten

Grundsätzlich habe ich eine Reihe von Gewichtungen (zufällige ganze Zahlen), z.

W() = [1, 4, 3, 2, 5, 3, 2, 1] 

Und ich möchte mit den Zahlen 1 auf die Größe des Arrays anstelle der kleinsten jeweils größten Zahlen ein weiteres Array von gleicher Länge erstellen, beispielsweise

S() = [1, 7, 5, 3, 8, 6, 4, 2] 

Für Duplikate wird das erste Vorkommen als der kleinere der Indizes genommen.

Ich habe ursprünglich einen BubbleSort-Algorithmus verwendet, aber das erlaubt mir leider nicht, eine Ausgabe im erforderlichen Format zu geben.

Ich verstehe, dass dies ein ganz bestimmtes Problem ist, aber jede Hilfe würde sehr geschätzt werden.

+1

Enthält diese Notwendigkeit in Erinnerung zu tun? Wenn nicht, wäre es mit ziemlicher Sicherheit besser, die Werte in eine Tabelle zu schreiben und die eingebauten Funktionen dazu zu verwenden – User632716

Antwort

0

Vielen Dank für alle, die Hilfe gegeben haben!

Ich nahm Ihre Vorschläge und schaffte es irgendwie, meine eigene Lösung zu schmieden, obwohl ich einen ganzen Tag an etwas gearbeitet habe, was mit meinem Gesamtprojekt wenig zu tun hat.

Hier ist der folgende Code, den ich verwendet:

Sub InitialSol(S() As Integer, n As Integer, k As Integer, W() As Long) 
Dim i As Integer, c As Integer 
Dim min As Long, max As Long, temp As Long 

min = W(1) 
max = W(1) 
For i = 2 To n 
    If W(i) <= min Then 
     min = W(i) 
    End If 
    If W(i) >= max Then 
     max = W(i) 
    End If 
Next i 

c = 1 
Do While c <= n 
    temp = max 
    For i = 1 To n 
     If W(i) = min Then 
      S(i) = c 
      c = c + 1 
     End If 
    Next i 
    For i = 1 To n 
     If W(i) > min And W(i) <= temp Then 
      temp = W(i) 
     End If 
    Next i 
    min = temp 
Loop 

End Sub 
1

Sie müssen einen Weg finden, um die Werte (Inhalt) und die Indizes zusammen zu kleben. Wie Sie die mit excel-vba markiert haben, würde ich vorschlagen, dass Sie schreiben Sie Daten in ein Blatt, erste Spalte die Werte und zweite Spalte die Indizes und sortieren sie mit range.sort. Danach die zweite Spalte hält Ihre Bestellung

Wenn Excel ist keine Option, die beste Wette, die ich darüber nachdenken kann, erstellen Sie eine Scripting.Dictionary (mit Index als Schlüssel) und sortieren Sie diese (es gibt keine Build-Funktion zum Sortieren es aber googeln Sie einige Beispiele finden.

Oder Sie etwas hässlich wie schaffen ein Array von Double von Ihnen Daten mit dem Dezimalteil Sie Index [1.001, 4.002, 3.003, 2.004, 5.005, 3.006, 2.007, 1.008] halten tun könnte, sortieren diese, die Dezimalstellen bekommen und sie multiplizieren zurück Ganzzahl

2

Probieren Sie es aus und lassen Sie mich wissen, wie es für Sie funktioniert:

Option Base 0 
Option Explicit 
Option Compare Text 

Sub tmpSO() 

Dim tmp As Double 
Dim strJoin As String 
Dim i As Long, j As Long 
Dim W As Variant, S() As Double, X() As Long 

'Load W 
W = Array(1, 4, 3, 2, 5, 3, 2, 1) 

'Set the dimensions for the other arrays 
ReDim S(LBound(W) To UBound(W)) 
ReDim X(LBound(W) To UBound(W)) 

'Copy W into S 
For i = LBound(W) To UBound(W) 
    S(i) = W(i) 
Next i 

'Sort S 
For i = LBound(S) To UBound(S) - 1 
    For j = i + 1 To UBound(S) 
     If S(i) > S(j) Then 
      tmp = S(j) 
      S(j) = S(i) 
      S(i) = tmp 
     End If 
    Next j 
Next i 

'Get the results into X 
For i = LBound(S) To UBound(S) 
    X(i) = WorksheetFunction.Match(W(i), S, 0) 
    S(WorksheetFunction.Match(W(i), S, 0) - 1) = vbEmpty 
Next i 

'Print out W (original array) 
Debug.Print Join(W, ",") 

'Print out x (result array) 
For i = LBound(X) To UBound(X) 
    strJoin = strJoin & "," & X(i) 
Next i 
Debug.Print mid(strJoin, 2) 

End Sub 
+0

Schöne Antwort @Ralph –

Verwandte Themen