返回列表 上一主題 發帖

[原創] 快速穩定排序法測試

(1) 用 value 會比較快
(2) 當初是因為在你的2維Sub測 AR2D( 1萬 , 300 ) ,看一下 Ram 最高峰可以爆到 600 MB, 才加上去
  現在 Sub 已經改成1維, 遞迴所需量大概會降為 600 MB / 300 = 2 MB , 可以拿掉 ReDim Preserve 會比較快  
(3)  UBound(原始二維陣列, 2) 也先代入變數會比較快, 但通常無感

TOP

回復 11# jackyq


    感謝指教,看來你蠻專業的!

TOP

最後優化,從原本的0.198秒→0.089秒
  1. Option Explicit
  2. Option Base 1
  3. Option Compare Text

  4. Public Sub S_二維陣列快速插入穩定遞增排序_01(ByRef 原始二維陣列 As Variant, ByVal 排序維度 As Long, ByVal 排序鍵值 As Long, ByVal 起限 As Long, ByVal 迄限 As Long)

  5.     On Error Resume Next
  6.    
  7.     If 起限 >= 迄限 Then
  8.         Exit Sub
  9.     End If
  10.    
  11.     '------------------------------------------------------
  12.    
  13.     Dim X As Long
  14.     Dim Y As Long
  15.    
  16.     Dim 擷取成一維陣列 As Variant
  17.     Dim 索引陣列() As Long
  18.    
  19.     '------------------------------------------------------
  20.    
  21.     ReDim 擷取成一維陣列(起限 To 迄限) As Variant
  22.     ReDim 索引陣列(起限 To 迄限) As Long
  23.    
  24.     If 排序維度 = 1 Then
  25.         For X = 起限 To 迄限
  26.             擷取成一維陣列(X) = 原始二維陣列(X, 排序鍵值)
  27.             索引陣列(X) = X
  28.         Next X
  29.     Else
  30.         For Y = 起限 To 迄限
  31.             擷取成一維陣列(Y) = 原始二維陣列(排序鍵值, Y)
  32.             索引陣列(Y) = Y
  33.         Next Y
  34.     End If
  35.    
  36.     '------------------------------------------------------
  37.    
  38.     二維陣列快速插入穩定遞增排序 擷取成一維陣列, 索引陣列, 起限, 迄限
  39.    
  40.     '------------------------------------------------------
  41.    
  42.     Dim 複製原始二維陣列 As Variant
  43.    
  44.     複製原始二維陣列 = 原始二維陣列
  45.    
  46.     If 排序維度 = 1 Then
  47.         For X = 起限 To 迄限
  48.             For Y = LBound(原始二維陣列, 2) To UBound(原始二維陣列, 2)
  49.                 原始二維陣列(X, Y) = 複製原始二維陣列(索引陣列(X), Y)
  50.             Next Y
  51.         Next X
  52.     Else
  53.         For Y = 起限 To 迄限
  54.             For X = LBound(原始二維陣列, 1) To UBound(原始二維陣列, 1)
  55.                 原始二維陣列(X, Y) = 複製原始二維陣列(X, 索引陣列(Y))
  56.             Next X
  57.         Next Y
  58.     End If

  59. End Sub

  60. Public Sub 二維陣列快速插入穩定遞增排序(ByRef 原始一維陣列 As Variant, ByRef 索引陣列() As Long, ByVal 起限 As Long, ByVal 迄限 As Long)

  61.     On Error Resume Next
  62.    
  63.     If 起限 >= 迄限 Then
  64.         Exit Sub
  65.     End If
  66.    
  67.     '------------------------------------------------------
  68.    
  69.     Dim X As Long
  70.     Dim Y As Long
  71.     Dim S As Long
  72.     Dim M As Long
  73.     Dim E As Long
  74.     Dim N As Long
  75.    
  76.     Dim 暫存 As Variant
  77.     Dim 索引暫存 As Long
  78.     Dim 基準 As Variant
  79.    
  80.     '------------------------------------------------------
  81.    
  82.     If 迄限 - 起限 < 16 Then
  83.         For X = 起限 + 1 To 迄限
  84.             暫存 = 原始一維陣列(X)
  85.             索引暫存 = 索引陣列(X)
  86.             
  87.             For Y = X - 1 To 起限 Step -1
  88.                 If 暫存 >= 原始一維陣列(Y) Then
  89.                     Exit For
  90.                 End If
  91.                
  92.                 原始一維陣列(Y + 1) = 原始一維陣列(Y)
  93.                 索引陣列(Y + 1) = 索引陣列(Y)
  94.             Next Y
  95.             
  96.             原始一維陣列(Y + 1) = 暫存
  97.             索引陣列(Y + 1) = 索引暫存
  98.         Next X
  99.     Else
  100.         Dim 基準陣列(3) As Variant
  101.         
  102.         基準陣列(1) = 原始一維陣列(起限)
  103.         基準陣列(2) = 原始一維陣列((起限 + 迄限) \ 2)
  104.         基準陣列(3) = 原始一維陣列(迄限)
  105.         
  106.         For X = 2 To 3
  107.             暫存 = 基準陣列(X)
  108.             
  109.             For Y = X - 1 To 1 Step -1
  110.                 If 暫存 >= 基準陣列(Y) Then
  111.                     Exit For
  112.                 End If
  113.                
  114.                 基準陣列(Y + 1) = 基準陣列(Y)
  115.             Next Y
  116.             
  117.             基準陣列(Y + 1) = 暫存
  118.         Next X
  119.         
  120.         基準 = 基準陣列(2)
  121.         
  122.         '------------------------------------------------------
  123.         
  124.         Dim 起陣列 As Variant
  125.         Dim 基陣列 As Variant
  126.         Dim 迄陣列 As Variant
  127.         Dim 索引起陣列() As Long
  128.         Dim 索引基陣列() As Long
  129.         Dim 索引迄陣列() As Long
  130.         
  131.         ReDim 起陣列(迄限 - 起限) As Variant
  132.         ReDim 基陣列(迄限 - 起限 + 1) As Variant
  133.         ReDim 迄陣列(迄限 - 起限) As Variant
  134.         ReDim 索引起陣列(迄限 - 起限) As Long
  135.         ReDim 索引基陣列(迄限 - 起限 + 1) As Long
  136.         ReDim 索引迄陣列(迄限 - 起限) As Long
  137.         
  138.         S = 0
  139.         M = 0
  140.         E = 0
  141.         For X = 起限 To 迄限
  142.             暫存 = 原始一維陣列(X)
  143.             索引暫存 = 索引陣列(X)
  144.             
  145.             If 暫存 < 基準 Then
  146.                 S = S + 1
  147.                 起陣列(S) = 暫存
  148.                 索引起陣列(S) = 索引暫存
  149.             ElseIf 暫存 = 基準 Then
  150.                 M = M + 1
  151.                 基陣列(M) = 暫存
  152.                 索引基陣列(M) = 索引暫存
  153.             Else
  154.                 E = E + 1
  155.                 迄陣列(E) = 暫存
  156.                 索引迄陣列(E) = 索引暫存
  157.             End If
  158.         Next X
  159.         
  160.         '------------------------------------------------------
  161.         
  162.         If S > 1 Then
  163.             二維陣列快速插入穩定遞增排序 起陣列, 索引起陣列, 1, S
  164.         End If
  165.         
  166.         If E > 1 Then
  167.             二維陣列快速插入穩定遞增排序 迄陣列, 索引迄陣列, 1, E
  168.         End If
  169.         
  170.         '------------------------------------------------------
  171.         
  172.         N = 起限 - 1
  173.         For X = 1 To S
  174.             N = N + 1
  175.             原始一維陣列(N) = 起陣列(X)
  176.             索引陣列(N) = 索引起陣列(X)
  177.         Next X
  178.         
  179.         For X = 1 To M
  180.             N = N + 1
  181.             原始一維陣列(N) = 基陣列(X)
  182.             索引陣列(N) = 索引基陣列(X)
  183.         Next X
  184.         
  185.         For X = 1 To E
  186.             N = N + 1
  187.             原始一維陣列(N) = 迄陣列(X)
  188.             索引陣列(N) = 索引迄陣列(X)
  189.         Next X
  190.     End If

  191. End Sub
複製代碼

TOP

        靜思自在 : 有智慧才能分辨善惡邪正;有謙虛才能建立美滿人生。
返回列表 上一主題