Allora ecco il mio codice. Premetto che POTREBBE contenere qualche bug e SICURAMENTE può essere ottimizzato... insomma l'ho scritto di getto senza andare troppo per il sottile.
Per ordinare un array (di tipo qualsiasi purché omogeneo e comparabile) bisogna chiamare "qSort":
Call qSort(MioArray)
oppure
qSort MioArray
Ordina solo in modo crescente (ma non è difficile modificarlo per ordinamenti differenti)
codice:
Sub qSort(ByRef aArray)
Call IterQSort(aArray, 0, UBound(aArray))
End Sub
Sub IterQSort(ByRef aArray, iFrom, iTo)
Dim iElem, iPivot
Dim iCnt, vBuffer
iElem = (iTo - iFrom) + 1
Select Case iElem
Case 1
'Do nothing
Case 2
If aArray(iFrom) > aArray(iTo) Then
Call Swap(aArray(iFrom), aArray(iTo))
End If
'Done.
Case Else
'Choose Pivot
Randomize
iPivot = Int(iElem * Rnd + 1)
'Move Pivot to first Element
Call Swap(aArray(iFrom), aArray(iFrom+(iPivot-1)))
'From now with iPivot I mean first element gt the pivot (iFrom)
iPivot = iFrom + 1
'Separate gt from le
For iCnt = iFrom+1 to iTo
If aArray(iCnt) < aArray(iFrom) Then
If iPivot < iCnt Then
Call Swap(aArray(iCnt), aArray(iPivot))
End If
iPivot = iPivot + 1
End If
Next
'Now iFrom -> iPivot-1 are lt iPivot -> iTo
If iPivot > iTo Then
'All elements are lt iFrom (the pivot)
Call Swap(aArray(iFrom), aArray(iTo))
Call IterQSort(aArray, iFrom, iTo-1)
Else
'Recursively sort the two chunk
Call IterQSort(aArray, iFrom, iPivot-1)
Call IterQSort(aArray, iPivot, iTo)
End If
End Select
End Sub
'Swap two values each other
Sub Swap(ByRef vVar1, ByRef vVar2)
Dim vBuffer
vBuffer = vVar1
vVar1 = vVar2
vVar2 = vBuffer
End Sub
Bye.