Option Explicit
Public Sub QSort(Grid As MSFlexGrid, ByVal Column As Integer, ByVal min As Long, _ ByVal max As Long, ByVal Ascending As Boolean, ByVal NumComp As Boolean)
Dim tmp() ReDim tmp(Grid.Cols) Dim med_value, hi As Long, lo As Long, i As Integer
If min >= max Then Exit Sub
med_value = Grid.TextMatrix(min, Column) SaveRow Grid, min, tmp
lo = min hi = max
Do Do While Compare(Grid.TextMatrix(hi, Column), med_value, NumComp, Ascending) >= 0 hi = hi - 1 If hi <= lo Then Exit Do Loop If hi <= lo Then RestoreRow Grid, lo, tmp Exit Do End If For i = 0 To Grid.Cols - 1 Grid.TextMatrix(lo, i) = Grid.TextMatrix(hi, i) Next i lo = lo + 1 Do While Compare(Grid.TextMatrix(lo, Column), med_value, NumComp, Ascending) < 0 lo = lo + 1 If lo >= hi Then Exit Do Loop If lo >= hi Then lo = hi RestoreRow Grid, hi, tmp Exit Do End If For i = 0 To Grid.Cols - 1 Grid.TextMatrix(hi, i) = Grid.TextMatrix(lo, i) Next i Loop
QSort Grid, Column, min, lo - 1, Ascending, NumComp QSort Grid, Column, lo + 1, max, Ascending, NumComp End Sub
Private Function Compare(ByVal X, ByVal Y, ByVal NumComp As Boolean, _ ByVal Ascending As Boolean) As Integer
Dim b As Integer
If NumComp Then X = CDbl(X) Y = CDbl(Y) End If If X > Y Then b = 1 If X < Y Then b = -1 If X = Y Then b = 0 If Not Ascending Then b = -b Compare = b End Function
Private Sub RestoreRow(Grid As MSFlexGrid, ByVal RowNum As Long, tmpArr())
Dim i As Long
For i = 0 To Grid.Cols - 1 Grid.TextMatrix(RowNum, i) = tmpArr(i) Next i End Sub
Private Sub SaveRow(Grid As MSFlexGrid, ByVal RowNum As Long, tmpArr())
Dim i As Long
For i = 0 To Grid.Cols - 1 tmpArr(i) = Grid.TextMatrix(RowNum, i) Next i End Sub
|