Board logo

標題: [原創] 快速插入排序 [打印本頁]

作者: linyancheng    時間: 2017-2-19 19:44     標題: 快速插入排序

排序陣列:10000 x 2 的整數(但我的引數代碼是Variant)
(重複數字大概在5~20個之間)
執行100次秒數總合:

一維重複順序(非穩)        3.296
一維重複逆序(非穩)        3.641
一維重複亂序(非穩)        5.499
一維不重複順序(非穩)        2.814
一維不重複逆序(非穩)        3.166
一維不重複亂序(非穩)        6.153
一維重複順序(穩定)        4.687
一維重複逆序(穩定)        4.876
一維重複亂序(穩定)        5.479
一維不重複順序(穩定)        6.56
一維不重複逆序(穩定)        8.148
一維不重複亂序(穩定)        9.1
二維重複順序(穩定)        5.176
二維重複逆序(穩定)        5.517
二維重複亂序(穩定)        5.89
二維不重複順序(穩定)        7.598
二維不重複逆序(穩定)        9.238
二維不重複亂序(穩定)        9.462
  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 String)

  5.     On Error Resume Next
  6.    
  7.     If 起限 >= 迄限 Then
  8.         Exit Sub
  9.     End If
  10.    
  11.     '------------------------------------------------------
  12.    
  13.     Select Case 遞增或遞減
  14.         Case "遞增"
  15.             一維陣列快速插入遞增排序 原始一維陣列, 起限, 迄限
  16.         Case "遞減"
  17.             一維陣列快速插入遞減排序 原始一維陣列, 起限, 迄限
  18.     End Select

  19. End Sub

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

  21.     On Error Resume Next
  22.    
  23.     If 起限 >= 迄限 Then
  24.         Exit Sub
  25.     End If
  26.    
  27.     '------------------------------------------------------
  28.    
  29.     Dim X As Long
  30.     Dim Y As Long
  31.     Dim S As Long
  32.     Dim E As Long
  33.    
  34.     Dim 暫存 As Variant
  35.     Dim 基準 As Variant
  36.    
  37.     '------------------------------------------------------
  38.    
  39.     If 迄限 - 起限 < 16 Then
  40.         For X = 起限 + 1 To 迄限
  41.             暫存 = 原始一維陣列(X)
  42.             
  43.             For Y = X - 1 To 起限 Step -1
  44.                 If 暫存 >= 原始一維陣列(Y) Then
  45.                     Exit For
  46.                 End If
  47.                
  48.                 原始一維陣列(Y + 1) = 原始一維陣列(Y)
  49.             Next Y
  50.             
  51.             原始一維陣列(Y + 1) = 暫存
  52.         Next X
  53.     Else
  54.         Dim 基準陣列(3) As Variant
  55.         
  56.         基準陣列(1) = 原始一維陣列(起限)
  57.         基準陣列(2) = 原始一維陣列((起限 + 迄限) \ 2)
  58.         基準陣列(3) = 原始一維陣列(迄限)
  59.         
  60.         For X = 2 To 3
  61.             暫存 = 基準陣列(X)
  62.             
  63.             For Y = X - 1 To 1 Step -1
  64.                 If 暫存 >= 基準陣列(Y) Then
  65.                     Exit For
  66.                 End If
  67.                
  68.                 基準陣列(Y + 1) = 基準陣列(Y)
  69.             Next Y
  70.             
  71.             基準陣列(Y + 1) = 暫存
  72.         Next X
  73.         
  74.         基準 = 基準陣列(2)
  75.         
  76.         '------------------------------------------------------
  77.         
  78.         S = 起限 - 1
  79.         E = 迄限 + 1
  80.         Do
  81.             Do
  82.                 S = S + 1
  83.                
  84.                 If 原始一維陣列(S) >= 基準 Then
  85.                     Exit Do
  86.                 End If
  87.             Loop
  88.             
  89.             Do
  90.                 E = E - 1
  91.                
  92.                 If 原始一維陣列(E) <= 基準 Then
  93.                     Exit Do
  94.                 End If
  95.             Loop
  96.             
  97.             If E <= S Then
  98.                 Exit Do
  99.             End If
  100.             
  101.             暫存 = 原始一維陣列(S)
  102.             原始一維陣列(S) = 原始一維陣列(E)
  103.             原始一維陣列(E) = 暫存
  104.         Loop
  105.         
  106.         '------------------------------------------------------
  107.         
  108.         If 起限 < E And E < 迄限 Then
  109.             一維陣列快速插入遞增排序 原始一維陣列, 起限, E
  110.         End If
  111.         
  112.         If 起限 < S And S < 迄限 Then
  113.             一維陣列快速插入遞增排序 原始一維陣列, S, 迄限
  114.         End If
  115.     End If

  116. End Sub

  117. Public Sub 一維陣列快速插入遞減排序(ByRef 原始一維陣列 As Variant, ByVal 起限 As Long, ByVal 迄限 As Long)

  118.     On Error Resume Next
  119.    
  120.     If 起限 >= 迄限 Then
  121.         Exit Sub
  122.     End If
  123.    
  124.     '------------------------------------------------------
  125.    
  126.     Dim X As Long
  127.     Dim Y As Long
  128.     Dim S As Long
  129.     Dim E As Long
  130.    
  131.     Dim 暫存 As Variant
  132.     Dim 基準 As Variant
  133.    
  134.     '------------------------------------------------------
  135.    
  136.     If 迄限 - 起限 < 16 Then
  137.         For X = 起限 + 1 To 迄限
  138.             暫存 = 原始一維陣列(X)
  139.             
  140.             For Y = X - 1 To 起限 Step -1
  141.                 If 暫存 <= 原始一維陣列(Y) Then
  142.                     Exit For
  143.                 End If
  144.                
  145.                 原始一維陣列(Y + 1) = 原始一維陣列(Y)
  146.             Next Y
  147.             
  148.             原始一維陣列(Y + 1) = 暫存
  149.         Next X
  150.     Else
  151.         Dim 基準陣列(3) As Variant
  152.         
  153.         基準陣列(1) = 原始一維陣列(起限)
  154.         基準陣列(2) = 原始一維陣列((起限 + 迄限) \ 2)
  155.         基準陣列(3) = 原始一維陣列(迄限)
  156.         
  157.         For X = 2 To 3
  158.             暫存 = 基準陣列(X)
  159.             
  160.             For Y = X - 1 To 1 Step -1
  161.                 If 暫存 >= 基準陣列(Y) Then
  162.                     Exit For
  163.                 End If
  164.                
  165.                 基準陣列(Y + 1) = 基準陣列(Y)
  166.             Next Y
  167.             
  168.             基準陣列(Y + 1) = 暫存
  169.         Next X
  170.         
  171.         基準 = 基準陣列(2)
  172.         
  173.         '------------------------------------------------------
  174.         
  175.         S = 起限 - 1
  176.         E = 迄限 + 1
  177.         Do
  178.             Do
  179.                 S = S + 1
  180.                
  181.                 If 原始一維陣列(S) <= 基準 Then
  182.                     Exit Do
  183.                 End If
  184.             Loop
  185.             
  186.             Do
  187.                 E = E - 1
  188.                
  189.                 If 原始一維陣列(E) >= 基準 Then
  190.                     Exit Do
  191.                 End If
  192.             Loop
  193.             
  194.             If E <= S Then
  195.                 Exit Do
  196.             End If
  197.             
  198.             暫存 = 原始一維陣列(S)
  199.             原始一維陣列(S) = 原始一維陣列(E)
  200.             原始一維陣列(E) = 暫存
  201.         Loop
  202.         
  203.         '------------------------------------------------------
  204.         
  205.         If 起限 < E And E < 迄限 Then
  206.             一維陣列快速插入遞減排序 原始一維陣列, 起限, E
  207.         End If
  208.         
  209.         If 起限 < S And S < 迄限 Then
  210.             一維陣列快速插入遞減排序 原始一維陣列, S, 迄限
  211.         End If
  212.     End If

  213. End Sub
複製代碼

作者: linyancheng    時間: 2017-2-19 19:51

  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 String)

  5.     On Error Resume Next
  6.    
  7.     If 起限 >= 迄限 Then
  8.         Exit Sub
  9.     End If
  10.    
  11.     '------------------------------------------------------
  12.    
  13.     Dim X As Long
  14.    
  15.     Dim 索引陣列() As Long
  16.    
  17.     '------------------------------------------------------
  18.    
  19.     ReDim 索引陣列(起限 To 迄限) As Long
  20.    
  21.     For X = 起限 To 迄限
  22.         索引陣列(X) = X
  23.     Next X
  24.    
  25.     '------------------------------------------------------
  26.    
  27.     Select Case 遞增或遞減
  28.         Case "遞增"
  29.             一維陣列快速插入穩定遞增排序 原始一維陣列, 索引陣列, 起限, 迄限
  30.         Case "遞減"
  31.             一維陣列快速插入穩定遞減排序 原始一維陣列, 索引陣列, 起限, 迄限
  32.     End Select
  33.    
  34.     '------------------------------------------------------
  35.    
  36.     Dim 複製原始一維陣列 As Variant
  37.    
  38.     複製原始一維陣列 = 原始一維陣列
  39.    
  40.     For X = 起限 To 迄限
  41.         原始一維陣列(X) = 複製原始一維陣列(索引陣列(X))
  42.     Next X

  43. End Sub

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

  45.     On Error Resume Next
  46.    
  47.     If 起限 >= 迄限 Then
  48.         Exit Sub
  49.     End If
  50.    
  51.     '------------------------------------------------------
  52.    
  53.     Dim X As Long
  54.     Dim Y As Long
  55.    
  56.     Dim 擷取成一維陣列 As Variant
  57.     Dim 索引陣列() As Long
  58.    
  59.     '------------------------------------------------------
  60.    
  61.     ReDim 擷取成一維陣列(起限 To 迄限) As Variant
  62.     ReDim 索引陣列(起限 To 迄限) As Long
  63.    
  64.     If 排序維度 = 1 Then
  65.         For X = 起限 To 迄限
  66.             擷取成一維陣列(X) = 原始二維陣列(X, 排序鍵值)
  67.             索引陣列(X) = X
  68.         Next X
  69.     Else
  70.         For Y = 起限 To 迄限
  71.             擷取成一維陣列(Y) = 原始二維陣列(排序鍵值, Y)
  72.             索引陣列(Y) = Y
  73.         Next Y
  74.     End If
  75.    
  76.     '------------------------------------------------------
  77.    
  78.     Select Case 遞增或遞減
  79.         Case "遞增"
  80.             一維陣列快速插入穩定遞增排序 擷取成一維陣列, 索引陣列, 起限, 迄限
  81.         Case "遞減"
  82.             一維陣列快速插入穩定遞減排序 擷取成一維陣列, 索引陣列, 起限, 迄限
  83.     End Select
  84.    
  85.     '------------------------------------------------------
  86.    
  87.     Dim 複製原始二維陣列 As Variant
  88.    
  89.     複製原始二維陣列 = 原始二維陣列
  90.    
  91.     If 排序維度 = 1 Then
  92.         For X = 起限 To 迄限
  93.             For Y = LBound(原始二維陣列, 2) To UBound(原始二維陣列, 2)
  94.                 原始二維陣列(X, Y) = 複製原始二維陣列(索引陣列(X), Y)
  95.             Next Y
  96.         Next X
  97.     Else
  98.         For Y = 起限 To 迄限
  99.             For X = LBound(原始二維陣列, 1) To UBound(原始二維陣列, 1)
  100.                 原始二維陣列(X, Y) = 複製原始二維陣列(X, 索引陣列(Y))
  101.             Next X
  102.         Next Y
  103.     End If

  104. End Sub
複製代碼

作者: linyancheng    時間: 2017-2-19 19:51

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

  2.     On Error Resume Next
  3.    
  4.     If 起限 >= 迄限 Then
  5.         Exit Sub
  6.     End If
  7.    
  8.     '------------------------------------------------------
  9.    
  10.     Dim X As Long
  11.     Dim Y As Long
  12.     Dim S As Long
  13.     Dim M As Long
  14.     Dim E As Long
  15.     Dim N As Long
  16.    
  17.     Dim 暫存 As Variant
  18.     Dim 索引暫存 As Long
  19.    
  20.     '------------------------------------------------------
  21.    
  22.     If 迄限 - 起限 < 16 Then
  23.         Dim 還原陣列 As Variant
  24.         
  25.         ReDim 還原陣列(起限 To 迄限) As Variant
  26.         
  27.         For X = 起限 To 迄限
  28.             還原陣列(X) = 原始一維陣列(索引陣列(X))
  29.         Next X
  30.         
  31.         For X = 起限 + 1 To 迄限
  32.             暫存 = 還原陣列(X)
  33.             索引暫存 = 索引陣列(X)
  34.             
  35.             For Y = X - 1 To 起限 Step -1
  36.                 If 暫存 >= 還原陣列(Y) Then
  37.                     Exit For
  38.                 End If
  39.                
  40.                 還原陣列(Y + 1) = 還原陣列(Y)
  41.                 索引陣列(Y + 1) = 索引陣列(Y)
  42.             Next Y
  43.             
  44.             還原陣列(Y + 1) = 暫存
  45.             索引陣列(Y + 1) = 索引暫存
  46.         Next X
  47.     Else
  48.         Dim 基準 As Variant
  49.         Dim 基準陣列(3) As Variant
  50.         
  51.         基準陣列(1) = 原始一維陣列(索引陣列(起限))
  52.         基準陣列(2) = 原始一維陣列(索引陣列((起限 + 迄限) \ 2))
  53.         基準陣列(3) = 原始一維陣列(索引陣列(迄限))
  54.         
  55.         For X = 2 To 3
  56.             暫存 = 基準陣列(X)
  57.             
  58.             For Y = X - 1 To 1 Step -1
  59.                 If 暫存 >= 基準陣列(Y) Then
  60.                     Exit For
  61.                 End If
  62.                
  63.                 基準陣列(Y + 1) = 基準陣列(Y)
  64.             Next Y
  65.             
  66.             基準陣列(Y + 1) = 暫存
  67.         Next X
  68.         
  69.         基準 = 基準陣列(2)
  70.         
  71.         '------------------------------------------------------
  72.         
  73.         Dim 索引起陣列() As Long
  74.         Dim 索引基陣列() As Long
  75.         Dim 索引迄陣列() As Long
  76.         
  77.         ReDim 索引起陣列(迄限 - 起限) As Long
  78.         ReDim 索引基陣列(迄限 - 起限 + 1) As Long
  79.         ReDim 索引迄陣列(迄限 - 起限) As Long
  80.         
  81.         S = 0
  82.         M = 0
  83.         E = 0
  84.         For X = 起限 To 迄限
  85.             索引暫存 = 索引陣列(X)
  86.             暫存 = 原始一維陣列(索引暫存)
  87.             
  88.             If 暫存 = 基準 Then
  89.                 M = M + 1
  90.                 索引基陣列(M) = 索引暫存
  91.             ElseIf 暫存 < 基準 Then
  92.                 S = S + 1
  93.                 索引起陣列(S) = 索引暫存
  94.             Else
  95.                 E = E + 1
  96.                 索引迄陣列(E) = 索引暫存
  97.             End If
  98.         Next X
  99.         
  100.         '------------------------------------------------------
  101.         
  102.         If S > 1 Then
  103.             一維陣列快速插入穩定遞增排序 原始一維陣列, 索引起陣列, 1, S
  104.         End If
  105.         
  106.         If E > 1 Then
  107.             一維陣列快速插入穩定遞增排序 原始一維陣列, 索引迄陣列, 1, E
  108.         End If
  109.         
  110.         '------------------------------------------------------
  111.         
  112.         N = 起限 - 1
  113.         For X = 1 To S
  114.             N = N + 1
  115.             索引陣列(N) = 索引起陣列(X)
  116.         Next X
  117.         
  118.         For X = 1 To M
  119.             N = N + 1
  120.             索引陣列(N) = 索引基陣列(X)
  121.         Next X
  122.         
  123.         For X = 1 To E
  124.             N = N + 1
  125.             索引陣列(N) = 索引迄陣列(X)
  126.         Next X
  127.     End If

  128. End Sub

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

  130.     On Error Resume Next
  131.    
  132.     If 起限 >= 迄限 Then
  133.         Exit Sub
  134.     End If
  135.    
  136.     '------------------------------------------------------
  137.    
  138.     Dim X As Long
  139.     Dim Y As Long
  140.     Dim S As Long
  141.     Dim M As Long
  142.     Dim E As Long
  143.     Dim N As Long
  144.    
  145.     Dim 暫存 As Variant
  146.     Dim 索引暫存 As Long
  147.    
  148.     '------------------------------------------------------
  149.    
  150.     If 迄限 - 起限 < 16 Then
  151.         Dim 還原陣列 As Variant
  152.         
  153.         ReDim 還原陣列(起限 To 迄限) As Variant
  154.         
  155.         For X = 起限 To 迄限
  156.             還原陣列(X) = 原始一維陣列(索引陣列(X))
  157.         Next X
  158.         
  159.         For X = 起限 + 1 To 迄限
  160.             暫存 = 還原陣列(X)
  161.             索引暫存 = 索引陣列(X)
  162.             
  163.             For Y = X - 1 To 起限 Step -1
  164.                 If 暫存 <= 還原陣列(Y) Then
  165.                     Exit For
  166.                 End If
  167.                
  168.                 還原陣列(Y + 1) = 還原陣列(Y)
  169.                 索引陣列(Y + 1) = 索引陣列(Y)
  170.             Next Y
  171.             
  172.             還原陣列(Y + 1) = 暫存
  173.             索引陣列(Y + 1) = 索引暫存
  174.         Next X
  175.     Else
  176.         Dim 基準 As Variant
  177.         Dim 基準陣列(3) As Variant
  178.         
  179.         基準陣列(1) = 原始一維陣列(索引陣列(起限))
  180.         基準陣列(2) = 原始一維陣列(索引陣列((起限 + 迄限) \ 2))
  181.         基準陣列(3) = 原始一維陣列(索引陣列(迄限))
  182.         
  183.         For X = 2 To 3
  184.             暫存 = 基準陣列(X)
  185.             
  186.             For Y = X - 1 To 1 Step -1
  187.                 If 暫存 >= 基準陣列(Y) Then
  188.                     Exit For
  189.                 End If
  190.                
  191.                 基準陣列(Y + 1) = 基準陣列(Y)
  192.             Next Y
  193.             
  194.             基準陣列(Y + 1) = 暫存
  195.         Next X
  196.         
  197.         基準 = 基準陣列(2)
  198.         
  199.         '------------------------------------------------------
  200.         
  201.         Dim 索引起陣列() As Long
  202.         Dim 索引基陣列() As Long
  203.         Dim 索引迄陣列() As Long
  204.         
  205.         ReDim 索引起陣列(迄限 - 起限) As Long
  206.         ReDim 索引基陣列(迄限 - 起限 + 1) As Long
  207.         ReDim 索引迄陣列(迄限 - 起限) As Long
  208.         
  209.         S = 0
  210.         M = 0
  211.         E = 0
  212.         For X = 起限 To 迄限
  213.             索引暫存 = 索引陣列(X)
  214.             暫存 = 原始一維陣列(索引暫存)
  215.             
  216.             If 暫存 = 基準 Then
  217.                 M = M + 1
  218.                 索引基陣列(M) = 索引暫存
  219.             ElseIf 暫存 > 基準 Then
  220.                 S = S + 1
  221.                 索引起陣列(S) = 索引暫存
  222.             Else
  223.                 E = E + 1
  224.                 索引迄陣列(E) = 索引暫存
  225.             End If
  226.         Next X
  227.         
  228.         '------------------------------------------------------
  229.         
  230.         If S > 1 Then
  231.             一維陣列快速插入穩定遞減排序 原始一維陣列, 索引起陣列, 1, S
  232.         End If
  233.         
  234.         If E > 1 Then
  235.             一維陣列快速插入穩定遞減排序 原始一維陣列, 索引迄陣列, 1, E
  236.         End If
  237.         
  238.         '------------------------------------------------------
  239.         
  240.         N = 起限 - 1
  241.         For X = 1 To S
  242.             N = N + 1
  243.             索引陣列(N) = 索引起陣列(X)
  244.         Next X
  245.         
  246.         For X = 1 To M
  247.             N = N + 1
  248.             索引陣列(N) = 索引基陣列(X)
  249.         Next X
  250.         
  251.         For X = 1 To E
  252.             N = N + 1
  253.             索引陣列(N) = 索引迄陣列(X)
  254.         Next X
  255.     End If

  256. End Sub
複製代碼





歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)