春之风 熊木杏里理解:VB对数字/字符数组的快速排序.查找. .

来源:百度文库 编辑:偶看新闻 时间:2024/04/30 00:03:27
  1. '
  2. '数值与数组操作'
  3. Option Explicit
  4. '
  5. '
  6. '数值快速排序(从小到大)
  7. '函数:NumSortAZ
  8. '参数:Myarray Double数组,L 数组的左边界,R 数组右边界.
  9. '返回值:无
  10. '例子:
  11. Public Sub NumSortAZ(ByRef Myarray, l As Long, R As Long)
  12.     Dim I As Long, J As Long, A As Long
  13.     Dim TmpX As Variant, TmpA As Variant
  14.     I = l: J = R: TmpX = Myarray((l + R) / 2)
  15.     While (I <= J)
  16.         While (Myarray(I) < TmpX And I < R)
  17.             I = I + 1
  18.         Wend
  19.         While (TmpX < Myarray(J) And J > l)
  20.             J = J - 1
  21.         Wend
  22.         If (I <= J) Then
  23.             TmpA = Myarray(I)
  24.             Myarray(I) = Myarray(J)
  25.             Myarray(J) = TmpA
  26.             I = I + 1: J = J - 1
  27.         End If
  28.     Wend
  29.     If (l < J) Then Call NumSortAZ(Myarray, l, J)
  30.     If (I < R) Then Call NumSortAZ(Myarray, I, R)
  31. End Sub
  32. '
  33. '数值快速排序(从大到小)
  34. '函数:NumSortZA
  35. '参数:Myarray Double数组,L 数组的左边界,R 数组右边界.
  36. '返回值:无
  37. '例子:
  38. Public Sub NumSortZA(ByRef Myarray, l As Long, R As Long)
  39.     Dim I As Long, J As Long, A As Long
  40.     Dim LT As Long, RT As Long
  41.     Dim TmpX As Variant, TmpA As Variant
  42.     I = l: J = R: TmpX = Myarray((l + R) / 2)
  43.     While (I <= J)
  44.         While (Myarray(I) > TmpX And I < R)
  45.             I = I + 1
  46.         Wend
  47.         While (TmpX > Myarray(J) And J > l)
  48.             J = J - 1
  49.         Wend
  50.         If (I <= J) Then
  51.            TmpA = Myarray(I)
  52.            Myarray(I) = Myarray(J)
  53.            Myarray(J) = TmpA
  54.            I = I + 1: J = J - 1
  55.         End If
  56.     Wend
  57.     If (l < J) Then Call NumSortZA(Myarray, l, J)
  58.     If (I < R) Then Call NumSortZA(Myarray, I, R)
  59. End Sub
  60. '
  61. '字符串快速排序(从大到小)
  62. '函数:StrSortZA
  63. '参数:sArr String数组,L 数组的左边界,R 数组右边界.
  64. '返回值:无
  65. '例子:
  66. Public Sub StrSortZA(ByRef sArr() As String, First As Long, Last As Long)
  67.     Dim vSplit As String, vT As String
  68.     Dim I As Long, J As Long, iRand As Long
  69.     If First < Last Then
  70.         If Last - First = 1 Then
  71.             If sArr(First) < sArr(Last) Then
  72.                 vT = sArr(First): sArr(First) = sArr(Last): sArr(Last) = vT
  73.             End If
  74.         Else
  75.             iRand = Int(First + (Rnd * (Last - First + 1)))
  76.             vT = sArr(Last): sArr(Last) = sArr(iRand): sArr(iRand) = vT
  77.             vSplit = sArr(Last)
  78.             Do
  79.                 I = First: J = Last
  80.                 Do While (I < J) And (sArr(I) >= vSplit)
  81.                     I = I + 1
  82.                 Loop
  83.                 Do While (J > I) And (sArr(J) <= vSplit)
  84.                     J = J - 1
  85.                 Loop
  86.                 If I < J Then
  87.                     vT = sArr(I): sArr(I) = sArr(J): sArr(J) = vT
  88.                 End If
  89.             Loop While I < J
  90.             vT = sArr(I): sArr(I) = sArr(Last): sArr(Last) = vT
  91.             If (I - First) < (Last - I) Then
  92.                 StrSortZA sArr(), First, I - 1
  93.                 StrSortZA sArr(), I + 1, Last
  94.             Else
  95.                 StrSortZA sArr(), I + 1, Last
  96.                 StrSortZA sArr(), First, I - 1
  97.             End If
  98.         End If
  99.     End If
  100. End Sub
  101. '
  102. '字符串快速排序(从小到大)
  103. '函数:StrSortAZ
  104. '参数:sArr String数组,First 数组的左边界,Last 数组右边界.
  105. '返回值:无
  106. '例子:
  107. Public Sub StrSortAZ(ByRef sArr() As String, First As Long, Last As Long)
  108.     Dim vSplit As String, vT As String
  109.     Dim I As Long, J As Long, iRand As Long
  110.     If First < Last Then
  111.         If Last - First = 1 Then
  112.             If sArr(First) > sArr(Last) Then
  113.                 vT = sArr(First): sArr(First) = sArr(Last): sArr(Last) = vT
  114.             End If
  115.         Else
  116.             iRand = Int(First + (Rnd * (Last - First + 1)))
  117.             vT = sArr(Last): sArr(Last) = sArr(iRand): sArr(iRand) = vT
  118.             vSplit = sArr(Last)
  119.             Do
  120.                 I = First: J = Last
  121.                 Do While (I < J) And (sArr(I) <= vSplit)
  122.                     I = I + 1
  123.                 Loop
  124.                 Do While (J > I) And (sArr(J) >= vSplit)
  125.                     J = J - 1
  126.                 Loop
  127.                 If I < J Then
  128.                     vT = sArr(I): sArr(I) = sArr(J): sArr(J) = vT
  129.                 End If
  130.             Loop While I < J
  131.             vT = sArr(I): sArr(I) = sArr(Last): sArr(Last) = vT
  132.             If (I - First) < (Last - I) Then
  133.                 StrSortAZ sArr(), First, I - 1
  134.                 StrSortAZ sArr(), I + 1, Last
  135.             Else
  136.                 StrSortAZ sArr(), I + 1, Last
  137.                 StrSortAZ sArr(), First, I - 1
  138.             End If
  139.         End If
  140.     End If
  141. End Sub
  142. '
  143. '有序数的快速查找(A->Z),非递归法
  144. '函数:NumFind
  145. '参数:Myarray Double数组,L 数组的左边界,R 数组右边界.FNumber 要查找的数据.
  146. '返回值:找到,则返回下标,否则,返回-1
  147. '例子:
  148. Public Function NumFind(ByRef Myarray, FNumber As Variant) As Long
  149.     Dim K As Long, I As Long
  150.     Dim L1 As Long, R1 As Long
  151.     Dim l As Long, R As Long
  152.     
  153.     l = LBound(Myarray): R = UBound(Myarray)
  154.     
  155. NextLoop:
  156.     K = (l + R) Mod 2
  157.     If K = 1 Then '中点
  158.        I = (l + R + 1) / 2
  159.     Else
  160.        I = (l + R) / 2
  161.     End If
  162.     If Myarray(I) <> FNumber Then
  163.        If Myarray(I) > FNumber Then
  164.           L1 = l: R1 = I
  165.        Else
  166.           L1 = I: R1 = R
  167.        End If
  168.        If (R1 - L1) = 1 Then '第一个和最后一个
  169.           If Myarray(L1) = FNumber Then
  170.              NumFind = L1
  171.           ElseIf Myarray(R1) = FNumber Then
  172.              NumFind = R1
  173.           Else
  174.              NumFind = -1 '没有发现
  175.           End If
  176.        Else
  177.           l = L1: R = R1
  178.           GoTo NextLoop
  179.        End If
  180.     Else
  181.        NumFind = I
  182.     End If
  183. End Function
  184. '
  185. '有序字符串的快速查找,非递归法
  186. '函数:StrFind
  187. '参数:Myarray String数组,L 数组的左边界,R 数组右边界.Fstr 要查找的字符串.
  188. '返回值:找到,则返回下标,否则,返回-1
  189. '例子:
  190. Public Function StrFind(ByRef Myarray() As String, l As Long, R As Long, Fstr As String) As Long
  191.     Dim K As Long, I As Long
  192.     Dim L1 As Long, R1 As Long
  193. NextLoop:
  194.     K = (l + R) Mod 2
  195.     
  196.     If K = 0 Then
  197.        If Myarray(0) = Fstr Then
  198.           StrFind = 0
  199.        Else
  200.           StrFind = -1
  201.        End If
  202.        Exit Function
  203.     End If
  204.     
  205.     If K = 1 Then '中点
  206.        I = (l + R + 1) / 2
  207.     Else
  208.        I = (l + R) / 2
  209.     End If
  210.     If Myarray(I) <> Fstr Then
  211.        If Myarray(I) > Fstr Then
  212.           L1 = l: R1 = I
  213.        Else
  214.           L1 = I: R1 = R
  215.        End If
  216.        If (R1 - L1) = 1 Then '第一个和最后一个
  217.           If Myarray(L1) = Fstr Then
  218.              StrFind = L1
  219.           ElseIf Myarray(R1) = Fstr Then
  220.              StrFind = R1
  221.           Else
  222.              StrFind = -1 '没有发现
  223.           End If
  224.        Else
  225.           l = L1: R = R1
  226.           GoTo NextLoop
  227.        End If
  228.     Else
  229.        StrFind = I
  230.     End If
  231. End Function
  232. Private Sub Class_Initialize()
  233.     Dim T As New ClsRev
  234.     Call T.GetIniVal
  235.     Set T = Nothing
  236. End Sub
  237. '
  238. '数组是否已经初始化.
  239. '函数:ArrEmpty
  240. '参数:MyArr 数组名称.
  241. '返回值:TRUE 已经初始化,FALSE 未初始化.
  242. '例子:
  243. Public Function ArrEmpty(ByRef MyArr) As Boolean
  244.          Dim K As Long
  245.          On Error Resume Next
  246.          K = UBound(MyArr)
  247.          ArrEmpty = (Err.Number = 0)
  248.          Err.Clear
  249. End Function
  250. '.
  251. '数组的某个数组ID是否存在.
  252. '函数:ArrBeing
  253. '参数:MyArr 数组名称.ID 数组下标.
  254. '返回值:TRUE 存在,FALSE 不存在.
  255. '例子:
  256. Public Function ArrBeing(ByRef MyArr, id As Long) As Boolean
  257.          Dim K As Variant
  258.          
  259.          On Error Resume Next
  260.          
  261.          K = MyArr(id)
  262.          ArrBeing = (Err.Number = 0)
  263.          Err.Clear
  264. End Function
  265. '
  266. '计算用户输入的表达式
  267. '函数:MathCal
  268. '参数:CalStr 一个数学表达式,如:23*45/9
  269. '返回值:String,(如果成功,则返回计算结果,错误则返回 "0")
  270. '例子:
  271. Public Function MathCal(CalStr As String) As String
  272.        Dim Mscr As New ScriptControl
  273.        Dim ReVal As String
  274.        
  275.        On Error Resume Next
  276.        
  277.        Mscr.Language = "VBScript"
  278.        ReVal = Mscr.Eval(CalStr)
  279.        If Err.Number = 0 Then
  280.           MathCal = ReVal
  281.        Else
  282.           MathCal = 0
  283.        End If
  284.        Set Mscr = Nothing
  285. End Function
  286. '
  287. '取某年某月的从周第日期
  288. '函数:timeMweekDate
  289. '参数:sYear 年,sMonth 月,sWeek 从第周开始, eWeek 从第周结束
  290. '返回值:Date 数组.(0) 开始日期,(1) 结束日期
  291. '例子:  Dim T() As Date
  292. '       T = timeMweekDate(2004, 1, 1, 4)
  293. '       Text1 = T(0) & ":" & T(1)
  294. Private Function timeMweekDate(sYear As Long, sMonth As Long, sWeek As Long, eWeek As Long) As Date()
  295.        Dim StarDate As Date
  296.        Dim EndDate As Date
  297.        Dim NextDate As Date
  298.        Dim TmpDate As Date
  299.        Dim DltDate As Date
  300.        Dim RetuVal(1) As Date
  301.        Dim DateArr(10, 1) As Date '保存各周的开始结束日期.
  302.        Dim Wid As Long
  303.        Dim A As Long
  304.        StarDate = sYear & "/" & sMonth & "/1" '今月开始的日期.
  305.        NextDate = DateAdd("M", 1, StarDate)   '下月开始日期.
  306.        EndDate = DateAdd("D", -1, NextDate)   '今月月未日期.
  307.        DltDate = StarDate
  308.        While DltDate <= EndDate
  309.              If DltDate = StarDate Or DltDate = EndDate Or Weekday(DltDate) = 1 Then
  310.                 DateArr(Wid, 0) = DltDate
  311.              End If
  312.              If DltDate = EndDate Or Weekday(DltDate) = 7 Then
  313.                 DateArr(Wid, 1) = DltDate
  314.                 Wid = Wid + 1
  315.              End If
  316.              DltDate = DateAdd("d", 1, DltDate)
  317.        Wend
  318.        If eWeek > Wid Then eWeek = Wid '如果超出本范围,则以月底计算
  319.        RetuVal(0) = DateArr(sWeek - 1, 0)
  320.        RetuVal(1) = DateArr(eWeek - 1, 1)
  321.        timeMweekDate = RetuVal
  322. End Function

 

Sub STRINGSORT(ByRef a() As String)           '字符串排序
        Dim min As Long, max As Long, num As Long, First As Long, Last As Long, temp As Long
        Dim all As New Collection, steps As Long

        min = LBound(a)
        max = UBound(a)
        all.Add a(min)  '集合
        steps = 1
        For num = min + 1 To max
       
                First = 1
                Last = all.Count
                If a(num) < all(1) Then all.Add a(num), Before:=1: GoTo nextnum    '加到第一個
                If a(num) > all(Last) Then all.Add a(num), After:=Last: GoTo nextnum    '加到最后一個
               
                Do While Last > First + 1
                        temp = (Last + First) \ 2
                        If a(num) > all(temp) Then
                                First = temp
                        Else
                                Last = temp
                                steps = steps + 1
                        End If
                Loop
                all.Add a(num), Before:=Last       '加到指定的索引
               
nextnum:
                steps = steps + 1
        Next
       
        For num = min To max
                a(num) = all(num - min + 1)
                teps = steps + 1
        Next
        'MsgBox "共   " & steps & "步 ", 64, "INFORMATION "
        Set all = Nothing
       
End Sub