- 帖子
- 230
- 主題
- 75
- 精華
- 2
- 積分
- 337
- 點名
- 0
- 作業系統
- Windows 10
- 軟體版本
- Office 2000, 2019
- 閱讀權限
- 100
- 性別
- 男
- 來自
- 彰化縣
- 註冊時間
- 2013-7-18
- 最後登錄
- 2025-4-17
|
7#
發表於 2017-2-13 08:30
| 只看該作者
我的代碼,可幫忙優化嗎?謝謝!
Option Explicit
Option Base 1
Option Compare Text
Public Sub S_二維陣列快速穩定遞增排序_01(ByRef 原始二維陣列 As Variant, ByVal 排序維度 As Long, ByVal 排序元素序 As Long, ByVal 起限 As Long, ByVal 迄限 As Long)
On Error Resume Next
Dim N As Long
Dim H As Long
Dim K As Long
Dim X As Long
Dim Y As Long
Dim 陣列限數 As Long
Dim 基準 As Variant
Dim 原始二維陣列數 As Long
Dim 陣列累計數 As Long
Dim 起陣列() As Variant
Dim 迄陣列() As Variant
Dim 基陣列() As Variant
陣列限數 = 迄限 - 起限 + 1
If 陣列限數 < 2 Then
Exit Sub
End If
If 排序維度 = 1 Then
基準 = 原始二維陣列((起限 + 迄限) \ 2, 排序元素序)
原始二維陣列數 = UBound(原始二維陣列, 2) - LBound(原始二維陣列, 2) + 1
ReDim 起陣列(陣列限數 - 1, 原始二維陣列數) As Variant
ReDim 迄陣列(陣列限數 - 1, 原始二維陣列數) As Variant
ReDim 基陣列(陣列限數, 原始二維陣列數) As Variant
N = 0
H = 0
K = 0
For X = 起限 To 迄限
If 原始二維陣列(X, 排序元素序) < 基準 Then
N = N + 1
For Y = LBound(原始二維陣列, 2) To UBound(原始二維陣列, 2)
起陣列(N, Y) = 原始二維陣列(X, Y)
Next Y
ElseIf 原始二維陣列(X, 排序元素序) = 基準 Then
H = H + 1
For Y = LBound(原始二維陣列, 2) To UBound(原始二維陣列, 2)
基陣列(H, Y) = 原始二維陣列(X, Y)
Next Y
Else
K = K + 1
For Y = LBound(原始二維陣列, 2) To UBound(原始二維陣列, 2)
迄陣列(K, Y) = 原始二維陣列(X, Y)
Next Y
End If
Next X
If N > 1 Then
S_二維陣列快速穩定遞增排序_01 起陣列, 1, 排序元素序, 1, N
End If
If K > 1 Then
S_二維陣列快速穩定遞增排序_01 迄陣列, 1, 排序元素序, 1, K
End If
陣列累計數 = 0
For X = 起限 To 迄限
陣列累計數 = 陣列累計數 + 1
If 陣列累計數 <= N Then
For Y = LBound(原始二維陣列, 2) To UBound(原始二維陣列, 2)
原始二維陣列(X, Y) = 起陣列(陣列累計數, Y)
Next Y
ElseIf 陣列累計數 <= (N + H) Then
For Y = LBound(原始二維陣列, 2) To UBound(原始二維陣列, 2)
原始二維陣列(X, Y) = 基陣列(陣列累計數 - N, Y)
Next Y
Else
For Y = LBound(原始二維陣列, 2) To UBound(原始二維陣列, 2)
原始二維陣列(X, Y) = 迄陣列(陣列累計數 - N - H, Y)
Next Y
End If
Next X
Else
基準 = 原始二維陣列(排序元素序, (起限 + 迄限) \ 2)
原始二維陣列數 = UBound(原始二維陣列, 1) - LBound(原始二維陣列, 1) + 1
ReDim 起陣列(原始二維陣列數, 陣列限數 - 1) As Variant
ReDim 迄陣列(原始二維陣列數, 陣列限數 - 1) As Variant
ReDim 基陣列(原始二維陣列數, 陣列限數) As Variant
N = 0
H = 0
K = 0
For Y = 起限 To 迄限
If 原始二維陣列(排序元素序, Y) < 基準 Then
N = N + 1
For X = LBound(原始二維陣列, 1) To UBound(原始二維陣列, 1)
起陣列(X, N) = 原始二維陣列(X, Y)
Next X
ElseIf 原始二維陣列(排序元素序, Y) = 基準 Then
H = H + 1
For X = LBound(原始二維陣列, 1) To UBound(原始二維陣列, 1)
基陣列(X, H) = 原始二維陣列(X, Y)
Next X
Else
K = K + 1
For X = LBound(原始二維陣列, 1) To UBound(原始二維陣列, 1)
迄陣列(X, K) = 原始二維陣列(X, Y)
Next X
End If
Next Y
If N > 1 Then
S_二維陣列快速穩定遞增排序_01 起陣列, 2, 排序元素序, 1, N
End If
If K > 1 Then
S_二維陣列快速穩定遞增排序_01 迄陣列, 2, 排序元素序, 1, K
End If
陣列累計數 = 0
For Y = 起限 To 迄限
陣列累計數 = 陣列累計數 + 1
If 陣列累計數 <= N Then
For X = LBound(原始二維陣列, 1) To UBound(原始二維陣列, 1)
原始二維陣列(X, Y) = 起陣列(X, 陣列累計數)
Next X
ElseIf 陣列累計數 <= (N + H) Then
For X = LBound(原始二維陣列, 1) To UBound(原始二維陣列, 1)
原始二維陣列(X, Y) = 基陣列(X, 陣列累計數 - N)
Next X
Else
For X = LBound(原始二維陣列, 1) To UBound(原始二維陣列, 1)
原始二維陣列(X, Y) = 迄陣列(X, 陣列累計數 - N - H)
Next X
End If
Next Y
End If
End Sub |
|