楼主 fāi |
- '通用数组排序 - Array_Sort(支持二维或一维)---by fāi
- '正确定义数据类型---速度的前提 '数据类型 稍改 速度约3倍:Function Array_Sort(Array_&(), Key1&, Order&)
- '经本人测试 :二维数组时 冒泡法 并不比 桶排序 、选择排序 差
- Function Array_Sort(Array_, Key1, Order) '(Array_[将要排序的数组], Key1[垂直数组(y,x)中x,像表格中的哪一列作关键字], Order[=1,升序;<>1,降序])
- Dim t, x&, y&, i&, j&, k&, xx&, yy&, tt&, AD&
- '以下的For…Next 是判断数组维数
- For i = 1 To 60
- On Error Resume Next
- Err.Clear
- tt = UBound(Array_, i)
- If Err.Number = 9 Then AD = i - 1: Exit For 'AD,数组维数
- Next
- '以下的IF…Then…即若是一维通过转置为二维,若是二维以上则Exit Function
- If AD = 2 Then
- If Not (Key1 >= LBound(Array_, 2) And Key1 <= UBound(Array_, 2)) Then Exit Function
- ElseIf AD = 1 Then
- Array_ = Application.Transpose(Array_)
- Key1 = 1
- Else
- Exit Function
- End If
- 'UBound 函数与 LBound 函数一起使用,用来确定一个数组的大小。LBound 用来确定数组某一维的上界。UBound,其值为指定的数组维可用的最大下标。
- y = LBound(Array_, 1): x = LBound(Array_, 2)
- yy = UBound(Array_): xx = UBound(Array_, 2)
- If Order = 1 Then '升序
- For i = y To yy - 1
- For j = i + 1 To yy
- If Array_(j, Key1) < Array_(i, Key1) Then '冒泡排序法
- For k = x To xx
- t = Array_(j, k): Array_(j, k) = Array_(i, k): Array_(i, k) = t
- Next
- End If
- Next
- Next
- Else '降序
- For i = y To yy - 1
- For j = i + 1 To yy
- If Array_(j, Key1) > Array_(i, Key1) Then
- For k = x To xx
- t = Array_(j, k): Array_(j, k) = Array_(i, k): Array_(i, k) = t
- Next
- End If
- Next
- Next
- End If
- If AD = 2 Then Array_Sort = Array_ Else Array_Sort = Application.Transpose(Array_) '如果是一维数组,重新转置为原来…
- End Function
通用数组排序(支持二维或一维).rar |