[VB6] Een array sorteren met behoudt van indexes

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Evertt_IA
  • Registratie: April 2008
  • Laatst online: 02-05-2021
Hoi, ik wil het volgende doen.

Stel ik heb: A = Array(2,4,1,3)
Dan wil ik een functie die A sorteert (van hoog naar laag), maar eigenlijk alleen de indexes van A en die in nieuwe array stopt, zodat A zelf intact blijft en ik een nieuwe lijst krijg die aangeeft op welke indexes ik in A de hoogste getallen kan vinden: B = Sorteer(A)
Dan komt eruit: B = Array(1,3,0,2)
Want: het hoogste getal in A is 4, welke op index 1 staat (index telt altijd vanaf 0), dus het eerste getal in B is 1. het op-één-na-hoogste getal in A is 3, welke op index 3 staat, dus het tweede getal in B is 3.

Snappie? Ik weet, het is een beetje gaar uitgelegd, maar ik hoop dat het duidelijk is.


Nu kan ik die functie misschien wel zelf schrijven, maar dan wordt die waarschijnlijk helemaal vol met nested loops enzo en dan wordt die waarschijnlijk heel traag. En ik heb al zoveel loops in mijn programma's, ik wil ze zo veel mogelijk vermijden. Dus ik vroeg mij af of iemand een super efficiënte manier weet om dit voor elkaar te krijgen, misschien met API's ofzo, weet ik veel.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Evertt_IA schreef op zondag 15 november 2009 @ 18:04:
Nu kan ik die functie misschien wel zelf schrijven, maar dan wordt die waarschijnlijk helemaal vol met nested loops enzo en dan wordt die waarschijnlijk heel traag.
Waarom zou 't vol met nested loops komen en waarom zouden die (mits goed toegepast) traag zijn?
Evertt_IA schreef op zondag 15 november 2009 @ 18:04:
Dus ik vroeg mij af of iemand een super efficiënte manier weet om dit voor elkaar te krijgen, misschien met API's ofzo, weet ik veel.
Waarom probeer je het niet gewoon. Er zijn -tig sorteeralgoritmes en domweg door A heen fietsen en iedere iteratie de laagste/hoogste eruit pikken en de index ervan in B mikken is werkelijk kinderspel voor een naïef algoritme en doet al precies wat je wil. Van daar uit kun je het zo gek maken als je wil.

Anyhow: ik zie hier wel een "ik wil graag" maar het "en dit heb ik al geprobeerd" ontbreekt volledig waardoor het topic al gauw een scriptrequest lijkt; ik zou dan ook graag zien dat je je topicstart aanvult ;)
Evertt_IA schreef op zondag 15 november 2009 @ 18:04:
En ik heb al zoveel loops in mijn programma's, ik wil ze zo veel mogelijk vermijden.
Dit geeft me een behoorlijk dubbel gevoel. Er is helemaal niets mis met "loops"... maar al je zegt dat je "al zoveel loops" in je programma hebt begin ik me zorgen te maken; pas je ze wel goed toe? En waarom zou je ze willen vermijden als ze gewoon nodig zijn op die plekken in je code?

[ Voor 18% gewijzigd door RobIII op 15-11-2009 19:24 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 06:59

RayNbow

Kirika <3

Het algoritme is niet zo moeilijk. Kwestie van elk element koppelen met z'n index, dat resultaat sorteren en uiteindelijk het element weer weggooien. In Haskell:

ghci> import Data.List
ghci> let a = [2,4,1,3]
ghci> let a' = zip a [0..]
ghci> a'
[(2,0),(4,1),(1,2),(3,3)]
ghci> let sortDesc xs = reverse$sort xs  -- (NB: niet efficient, maar het gaat om 't idee)
ghci> let b' = sortDesc a'
ghci> b'
[(4,1),(3,3),(2,0),(1,2)]
ghci> let b = map snd b'
ghci> b
[1,3,0,2]


Het moet niet al te veel moeite kosten om deze gedachtengang naar VB6 te vertalen.

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • bastv
  • Registratie: September 2005
  • Laatst online: 08-09 20:34
ik denk niet dat er zoiets is voor vb6 je zal dus zelf erdoor moeten loopen.
misschien heb je hier iets aan. http://opensource.devx.com/vb2themax/Tip/18973

Acties:
  • 0 Henk 'm!

  • Evertt_IA
  • Registratie: April 2008
  • Laatst online: 02-05-2021
Ja ik ben toch maar er voor gegaan om quicksort te gebruiken en dan met een loop en een nested loop door de gesorteerde array heen te lopen en dan kijken welke waarde bij welke index hoort van de oude array.
RobIII schreef op zondag 15 november 2009 @ 19:22:
[...]

Waarom zou 't vol met nested loops komen en waarom zouden die (mits goed toegepast) traag zijn?
Waarom het vol met nested loops zou komen? Nou, het eerste waar ik zelf op kon komen was door de array loopen, dan de hoogste waarde opzoeken, die in de nieuwe array stoppen en uit de oude array verwijderen en dan nog een keer door de array gaan om de hoogste waarde te zoeken en te kopieren en te verwijderen en dan weer enzovoooooooortsss... Dat is dus een loop met een nested loop erin en het klinkt zoooooooo inefficient. En mijn ervaring is gewoon dat VB6 geen snelle taal is en loops maken het er nooit sneller op, dus daarom mag ik loops gewoon niet. Misschien zit het tussen mijn oren, maar ik heb altijd het gevoel dat als ik een ingebouwde functie gebruik dat alles dan sneller gaat dan als ik het zelf probeer met een aantal loops. Die ingebouwde functies zijn waarschijnlijk toch veel efficiënter gebouwd. Ik werk ook al een jaar of 2 in php en daar heb je echt bijna overal een ingebouwde functie voor, hemels. :P
RobIII schreef op zondag 15 november 2009 @ 19:22:
[...]

Waarom probeer je het niet gewoon. Er zijn -tig sorteeralgoritmes en domweg door A heen fietsen en iedere iteratie de laagste/hoogste eruit pikken en de index ervan in B mikken is werkelijk kinderspel voor een naïef algoritme en doet al precies wat je wil. Van daar uit kun je het zo gek maken als je wil.
Jup, maar dat wilde ik dus liever vermijden, al heb ik dat nu toch zo ongeveer gedaan.
RobIII schreef op zondag 15 november 2009 @ 19:22:
Anyhow: ik zie hier wel een "ik wil graag" maar het "en dit heb ik al geprobeerd" ontbreekt volledig waardoor het topic al gauw een scriptrequest lijkt; ik zou dan ook graag zien dat je je topicstart aanvult ;)
Hmmmm, goed punt, maar het probleem is nu al opgelost. :P
Min of meer.
RobIII schreef op zondag 15 november 2009 @ 19:22:
[...]

Dit geeft me een behoorlijk dubbel gevoel. Er is helemaal niets mis met "loops"... maar al je zegt dat je "al zoveel loops" in je programma hebt begin ik me zorgen te maken; pas je ze wel goed toe? En waarom zou je ze willen vermijden als ze gewoon nodig zijn op die plekken in je code?
Tuurlijk, op sommige plekken zijn ze gewoon nodig en dan kan ik ook niet zeuren. Maar ik ben in php nu een tijdje gewend dat alle basic-operations die je eventueel zou willen doen met een variabele een standaard-ingebouwde-functie zijn, bijvoorbeeld voor sorteren, dus ik hoopte heel even dat dat ook in VB6 zat, maar nee.

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 22:43
Evertt_IA schreef op zondag 15 november 2009 @ 21:21:
Ja ik ben toch maar er voor gegaan om quicksort te gebruiken en dan met een loop en een nested loop door de gesorteerde array heen te lopen en dan kijken welke waarde bij welke index hoort van de oude array.
Hoop dat je geen twee dezelfde waarden hebt dan ... je kunt toch een tweede even grote array maken met daarin de indices, waarbij je in je sorteer algorithme als waarde gebruikt ValueArray( IndexArray( X ) ) maar het eigenlijke swappen wat je moet doen in het IndexArray doet.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1