Miten saa järjestettyä 7 numeroa lyhyimmällä tavalla pienimmästä suurimpaan? Nyt olen yrittänyt ratkaista asiaa tosi pitkällä if-lause sarjalla... =) Kyse on lotto numeroista eli numerot 1-39 ovat käytössä.
https://www.ohjelmointiputka.net/koodivinkit/
Tuolla olisi QuickSortti QB:lle, jonka varmasti saat helposti väänettyksi toimimaan myös VB:llä.
Miten korvaan tossa koodissa olevan SWAP:in?
korjaa tämä: SWAP t(b%), t(c%)
suunnilleen tällaisella:
valiaikaistieto = t(b%)
valiaikaistieto2 = t(c%)
t(c%) = valiaikaistieto
t(b%) = valiaikaistieto2
EDIT: Ainiin, en ole kokeillut tuota, joten se ei välttämättä toimi ...
No, SWAP vaan vaihtaa muuttujat keskenään. Melko erikoista muuten, että se on VB:stä jätetty pois. Jokatapauksessa, lisää tällainen funktio jonnekin:
Public Sub Swap (a As Variant, b As Variant) Dim c As Variant c = a a = b b = c End Sub
lainaus:
Miten korvaan tossa koodissa olevan SWAP:in?
SWAP vaihtaa QB:ssa kahden muuttujan arvoja keskenään. Onnistuu ihan hyvin ilman erillistä funktiotakin, kierrätät vain toisen muuttujan arvon jonkin väliaikaisen muuttujan kautta.
a = 1 b = 2 tmp = -1 'Vaihdetaan a:n ja b:n arvot keskenään tmp = a a = b b = tmp
edit: fawkz oli sitten nopeampi...
QuickSort on hyvä silloin kun lajiteltavia on paljon. Jos kuitenkin lyhyintä tapaa haetaan, niin se ehkä on kuplalajittelu, joka lottonumeroiden tapauksessa on ihan toimiva ratkaisu. Kirjoitin pienen esimerkin:
'lottonumeroiden kuplalajittelu Dim maara As Integer, teksti As String Dim i As Integer, j As Integer, t As Integer 'numeroiden määrä maara = 7 'taulukko numeroille ReDim numerot(maara - 1) As Integer 'arvotaan numerot: voi tulla samoja... Randomize Timer For i = 0 To maara - 1 numerot(i) = Int(Rnd * 39) + 1 Next 'kulpalajittelu For i = 0 To maara For j = 0 To maara - 2 'jos numerot(j) on suurempi kuin numerot(j + 1), 'vaihdetaan taulukon alkioiden paikkaa If numerot(j) > numerot(j + 1) Then t = numerot(j) numerot(j) = numerot(j + 1) numerot(j + 1) = t End If Next Next 'muodostetaan merkkijono teksti = numerot(0) For i = 1 To maara - 1 teksti = teksti & ", " & numerot(i) Next 'näytetään numerot viesti-ikkunassa MsgBox "Numerot ovat: " & teksti
Aihe on jo aika vanha, joten et voi enää vastata siihen.