ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
12
返回列表 发新帖
楼主: linyancheng

[原创] 二維陣列快速插入穩定遞增排序

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-2-17 22:14 | 显示全部楼层
再優化

  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.     If 起限 >= 迄限 Then
  7.         Exit Sub
  8.     End If

  9.     '------------------------------------------------------

  10.     Dim X As Long
  11.     Dim Y As Long

  12.     Dim 擷取成一維陣列 As Variant
  13.     Dim 索引陣列() As Long

  14.     '------------------------------------------------------

  15.     ReDim 擷取成一維陣列(起限 To 迄限) As Variant
  16.     ReDim 索引陣列(起限 To 迄限) As Long

  17.     If 排序維度 = 1 Then
  18.         For X = 起限 To 迄限
  19.             擷取成一維陣列(X) = 原始二維陣列(X, 排序鍵值)
  20.             索引陣列(X) = X
  21.         Next X
  22.     Else
  23.         For Y = 起限 To 迄限
  24.             擷取成一維陣列(Y) = 原始二維陣列(排序鍵值, Y)
  25.             索引陣列(Y) = Y
  26.         Next Y
  27.     End If

  28.     '------------------------------------------------------

  29.     二維陣列快速插入穩定遞增排序 擷取成一維陣列, 索引陣列, 起限, 迄限

  30.     '------------------------------------------------------

  31.     Dim 複製原始二維陣列 As Variant

  32.     複製原始二維陣列 = 原始二維陣列

  33.     If 排序維度 = 1 Then
  34.         For X = 起限 To 迄限
  35.             For Y = LBound(原始二維陣列, 2) To UBound(原始二維陣列, 2)
  36.                 原始二維陣列(X, Y) = 複製原始二維陣列(索引陣列(X), Y)
  37.             Next Y
  38.         Next X
  39.     Else
  40.         For Y = 起限 To 迄限
  41.             For X = LBound(原始二維陣列, 1) To UBound(原始二維陣列, 1)
  42.                 原始二維陣列(X, Y) = 複製原始二維陣列(X, 索引陣列(Y))
  43.             Next X
  44.         Next Y
  45.     End If

  46. End Sub

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

  48.     On Error Resume Next

  49.     If 起限 >= 迄限 Then
  50.         Exit Sub
  51.     End If

  52.     '------------------------------------------------------

  53.     Dim X As Long
  54.     Dim Y As Long
  55.     Dim S As Long
  56.     Dim M As Long
  57.     Dim E As Long
  58.     Dim N As Long

  59.     Dim 暫存 As Variant
  60.     Dim 索引暫存 As Long

  61.     '------------------------------------------------------

  62.     If 迄限 - 起限 < 16 Then
  63.         Dim 還原陣列 As Variant

  64.         ReDim 還原陣列(起限 To 迄限) As Variant

  65.         For X = 起限 To 迄限
  66.             還原陣列(X) = 原始一維陣列(索引陣列(X))
  67.         Next X

  68.         For X = 起限 + 1 To 迄限
  69.             暫存 = 還原陣列(X)
  70.             索引暫存 = 索引陣列(X)

  71.             For Y = X - 1 To 起限 Step -1
  72.                 If 暫存 >= 還原陣列(Y) Then
  73.                     Exit For
  74.                 End If

  75.                 還原陣列(Y + 1) = 還原陣列(Y)
  76.                 索引陣列(Y + 1) = 索引陣列(Y)
  77.             Next Y

  78.             還原陣列(Y + 1) = 暫存
  79.             索引陣列(Y + 1) = 索引暫存
  80.         Next X
  81.     Else
  82.         Dim 基準 As Variant
  83.         Dim 基準陣列(3) As Variant

  84.         基準陣列(1) = 原始一維陣列(索引陣列(起限))
  85.         基準陣列(2) = 原始一維陣列(索引陣列((起限 + 迄限) \ 2))
  86.         基準陣列(3) = 原始一維陣列(索引陣列(迄限))

  87.         For X = 2 To 3
  88.             暫存 = 基準陣列(X)

  89.             For Y = X - 1 To 1 Step -1
  90.                 If 暫存 >= 基準陣列(Y) Then
  91.                     Exit For
  92.                 End If

  93.                 基準陣列(Y + 1) = 基準陣列(Y)
  94.             Next Y

  95.             基準陣列(Y + 1) = 暫存
  96.         Next X

  97.         基準 = 基準陣列(2)

  98.         '------------------------------------------------------

  99.         Dim 索引起陣列() As Long
  100.         Dim 索引基陣列() As Long
  101.         Dim 索引迄陣列() As Long

  102.         ReDim 索引起陣列(迄限 - 起限) As Long
  103.         ReDim 索引基陣列(迄限 - 起限 + 1) As Long
  104.         ReDim 索引迄陣列(迄限 - 起限) As Long

  105.         S = 0
  106.         M = 0
  107.         E = 0
  108.         For X = 起限 To 迄限
  109.             索引暫存 = 索引陣列(X)
  110.             暫存 = 原始一維陣列(索引暫存)

  111.             If 暫存 < 基準 Then
  112.                 S = S + 1
  113.                 索引起陣列(S) = 索引暫存
  114.             ElseIf 暫存 = 基準 Then
  115.                 M = M + 1
  116.                 索引基陣列(M) = 索引暫存
  117.             Else
  118.                 E = E + 1
  119.                 索引迄陣列(E) = 索引暫存
  120.             End If
  121.         Next X

  122.         '------------------------------------------------------

  123.         If S > 1 Then
  124.             二維陣列快速插入穩定遞增排序 原始一維陣列, 索引起陣列, 1, S
  125.         End If

  126.         If E > 1 Then
  127.             二維陣列快速插入穩定遞增排序 原始一維陣列, 索引迄陣列, 1, E
  128.         End If

  129.         '------------------------------------------------------

  130.         N = 起限 - 1
  131.         For X = 1 To S
  132.             N = N + 1
  133.             索引陣列(N) = 索引起陣列(X)
  134.         Next X

  135.         For X = 1 To M
  136.             N = N + 1
  137.             索引陣列(N) = 索引基陣列(X)
  138.         Next X

  139.         For X = 1 To E
  140.             N = N + 1
  141.             索引陣列(N) = 索引迄陣列(X)
  142.         Next X
  143.     End If

  144. End Sub
复制代码


排序陣列:10000 x 2 的整數(但我的引數代碼是Variant)

1.不重複數字:順序→執行100次總合→7.598秒
       逆序→執行100次總合→9.393秒
       亂序→執行100次總合→9.462秒
2.重複數字:順序→執行100次總合→5.176秒
      逆序→執行100次總合→5.517秒
      亂序→執行100次總合→5.89秒
(重複數字大概在5~20個之間)
估計重複不重複影響較大,順序較快,可能是插入排序的影響,逆序及亂序相差不大。

理論上時間:(不知正不正確)
插入排序:順序<亂序<逆序,重複<不重複
一般的快速穩定排序:順序<亂序≒逆序,不重複<重複
我的快速插入穩定排序:順序<逆序≒亂序,重複<不重複

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-11 19:45 , Processed in 0.043913 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表