meerdimensionele array sorteren

Status
Niet open voor verdere reacties.

IkBenHetMaar

Gebruiker
Lid geworden
23 mrt 2012
Berichten
18
Hallo iedereen,

Ik zou een meerdimensionele array moeten sorteren in VB

Ik geef een voorbeeld hoe de array eruit ziet en hoe hij gesorteerd moet worden:

waarden(1...4, w1,w2,w3)

als hij bv gevuld is als volgt:

waarden(1,50,25,1)
waarden(2,25,30,0)
waarden(3,10,15,0)
waarden(4,7,2,1)

moet hij na het sorteren op volgorde staan als volgt:

waarden(3,10,15,0)
waarden(2,25,30,0)
waarden(4,7,2,1)
waarden(1,50,25,1)


eerst dus de kleinste w1 waarden, dan de kleinste w2 waarden en dan de kleinste w3 waarden.
w3 kan slechts 0 of 1 zijn.

heeft iemand een idee hoe dit eenvoudig op te lossen.
het zou fijn zijn als dit werkt voor array's die ook langer zijn dan 4. dus wel flexible te programmeren aub.

Mvg
IkBenHetMaar
 
De eenvoudigste manier is sorteren in een werkblad.
 
Misschien heb je hier wat aan?
 
Sorteren is sowieso niet eenvoudig.

Ik denk dat voor VB de link die octafish heeft gestuurd bruikbaar is, en zoals SNB zegt, als je binnen Excel wilt gaan sorteren, gebruik dan een werkblad, want daar ga je niet aan tippen met VBA.
 
Bedankt iedereen. Ik heb voor VB/VBA gekozen omdat de uiteindelijke code in een microcontroller moet draaien. En VB/VBA leunt hier het meest dicht bij. Dus Excel kan ik niet gebruiken.
Groeten
 
Ik zou opteren voor een sortering in ascii-vorm.
Eerst maak je een parallelle array met de volgende waarde:
w3 & right(w2+100,2) & right(w1+100,2)
(w3 slechts 1 karakter groot, w2 en w1 twee karakters groot)

Dan sorteer je de tweede tabel en telkens als je waarden verwisselt, dan doe je dat ook met de overeenstemmende waarden in de eerste tabel.
Sorteren kan eenvoudig met bubblesort
 
Bedankt paulva, ik zelf had ook aan bubblesort gedacht, tevens omdat het maar over een beperkte array lengte gaat, echter het toepassen van die parallelle array, daar ben ik niet volledig mee wat je precies bedoelt. zou u dit even in een klein voorbeeldje willen gieten aub?

ik begrijp dat je twee arrays wil maken, maar het is dus wel noodzakelijk dat de waarden per rij bij elkaar blijven.

groeten,
 
Besten,

ik heb hier een voorbeeld gevonden in VB6 dat ik als basis kan gebruiken om een één- dimensionele array te sorteren.

Private SUB Form_Click()
DIM i AS INTEGER
DIM v AS Boolean
DIM j AS INTEGER
DIM temp AS INTEGER
DIM arr(4) AS INTEGER

arr(1) = 31
arr(2) = 2252
arr(3) = 12
arr(4) = 41

i = 1
v = True
DO WHILE i < 4 AND v = True
v = False
j = 1
DO WHILE j <= 4 - i
IF arr(j) > arr(j + 1) THEN
temp = arr(j)
arr(j) = arr(j + 1)
arr(j + 1) = temp
v = True
END IF
j = j + 1
LOOP
i = i + 1
LOOP
Me.CLS
FOR i = 1 TO 4
PRINT arr(i)
NEXT i
END SUB


heeft iemand een idee hoek ik hier een meerdimensionele array van kan maken en deze kan sorteren zodat de 3 waarden van tesamen blijven na het sorteren?

mvg
IkBenHetMaar
 
Misschien kan je je oplossing delen, zodat anderen die dezelfde vraag hebben er hun voordeel kunnen uithalen.:thumb:
 
oplossing

int size = 10;
double array1[10] = {100, 107, 108, 99, 75, 15, 18, 8, 1, 1};
double array2[10] = {5, 1, 8, 5, 1, 16, 72, 80, 19, 101};
double array3[10] = {1, 1, 1, 1, 1, 0, 0, 0, 0, 0};
int i = 0;
int x;
int swapped = 1;
double aux = 0;
int j = 0;
size -= 1;

for(i = 0; i < size && swapped; i++)
{
swapped = 0;
for(j = 0; j < size - i; j++)
if(
(array3[j] > array3[j+1])
|| (array3[j] == array3[j+1] && array1[j] > array1[j+1])
|| (array3[j] == array3[j+1] && array1[j] == array1[j+1] && array2[j] > array2[j+1]))
{



swapped = 1;


aux = array1[j];
array1[j] = array1[j + 1];
array1[j + 1] = aux;


aux = array2[j];
array2[j] = array2[j + 1];
array2[j + 1] = aux;


aux = array3[j];
array3[j] = array3[j + 1];
array3[j + 1] = aux;

}
}
 
...er worden hier drie aparte array's gebruikt voor het gemak, maar het zou evengoed kunnen met één driedimensionele array. het is dan een kwestie van de juiste indexen van de array te swappen...

de derde array heeft prioriteit 1
de eerste array heeft prioriteit 2
de tweede array heeft prioriteit 3

bubblesort is niet héél snel maar voor kleine arrays is dit toch te gebruiken.
door gebruik te maken van één if instructies waar alle prioriteiten samen zitten is het mogelijk om de drie arrays te sorteren in één bubblesort doorgang.
 
Dit lijkt me geen VBA.
Bovendien kun je in Excel gebruik maken van Excelfunkties; zeker als de sorteerkolom alleen cijfers bevat.
Bijv. als je een meerdimensionele array wil sorteren op kolom 7

Code:
Sub snb()
    sn = Cells(1).CurrentRegion
    
    sq = Application.Index(sn, 0, 7)
    st = sq
    For j = 1 To UBound(sq)
        st(j, 1) = Application.Match(Application.Large(sq, j), sq, 0)
    Next

    Cells(1).CurrentRegion.Offset(10) = Application.Index(sn, st, Evaluate("transpose(row(1:" & UBound(sn, 2) & "))"))
End Sub

voor het gemak heb ik de gegevens in een tabel bijv. A1:J3 gezet.
sn wordt daardoor een meer-dimensionele array.
Na sortering schrijf ik hem weg in het werkblad , maar het kan natuurlijk een array blijven:

Code:
Sub snb_002()
    sn = Cells(1).CurrentRegion
    
    sq = Application.Index(sn, 0, 7)
    st = sq
    For j = 1 To UBound(sq)
        st(j, 1) = Application.Match(Application.Large(sq, j), sq, 0)
    Next

    st = Application.Index(sn, st, Application.Transpose(Evaluate("row(" & Rows(1).Resize(UBound(sn, 2)).Address & ")")))
End Sub
 
Laatst bewerkt:
Dit lijkt me geen VBA.

Nee dit is geen VBA, ik heb mijn vraag gesteld in de VBA rubriek omdat deze taal het dichtst zou liggen in mijn toepassingsgebied (microcontroller) zoals vermeld in mijn eerste post met mijn vraagstelling. als ik dan de oplossing heb gevonden in C++ speelt het verder ook geen rol. dit is namelijk snel geconverteerd naar elke andere taal, bv VB, VBA of iets anders. het heeft uiteindelijk niets met Excel te maken...

misschien dat iemand het ooit kan gebruiken voor iets anders,
 
Code:
Sub snb()
    sn = Cells(1).CurrentRegion
    
    sq = Application.Index(sn, 0, 7)
    st = sq
    For j = 1 To UBound(sq)
        st(j, 1) = Application.Match(Application.Large(sq, j), sq, 0)
    Next

    Cells(1).CurrentRegion.Offset(10) = Application.Index(sn, st, Evaluate("transpose(row(1:" & UBound(sn, 2) & "))"))
End Sub


Mooi stukje code dit SNB! Ik was hier naar opzoek, uiteindelijk wel gelukt maar niet zo kort...

Achteraf gezien krijg ik een error type mismatch, op de 'Ubound' van 'sq' bij het initialiseren van de 'FOR'
 
Laatst bewerkt:
ik krijg geen error als ik de array transponeer

Maar ik krijg alleen de laatste waarde in kolom 1 te zien als ik de array plaats op het werkblad.
 
In de bijlage toegepast.
Er wordt gesorteerd op kolom 7 (G)


PS. Je moet het gebied waar je de array wil plaatsen qua grootte wel aanpassen aan de grootte van de array.

als sn de gesorteerde array is, bijv met:

Code:
cells(1,1).resize(ubound(sn)+1,ubound(sn,2)+1)=sn
 

Bijlagen

Laatst bewerkt:
dan SNB

blijf het een mooi stukje code vinden:)

.Match en .Large samen, ik was er niet opgekomen, ik sorteer al sinds jaar en dag via werkblad, maar toch netjes!
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan