|
- Sub test()
- Dim strMax$, strMin$, strTemp$
- strTemp = 432567
- getNewNumber strTemp, strMax, strMin
- MsgBox strTemp & vbCrLf & "最大值:" & strMax & vbCrLf & "最小值:" & strMin
- strTemp = 29427823023#
- getNewNumber strTemp, strMax, strMin
- MsgBox strTemp & vbCrLf & "最大值:" & strMax & vbCrLf & "最小值:" & strMin
- End Sub
- Function getNewNumber(lNumber As String, ByRef strMax$, ByRef strMin$) As String
- '参数可传入纯数值或数值型字符串,不能带小数点,不能是科学计数法表示的数字
- Dim bOdd As Byte, bEven As Byte
- Dim i As Integer
- Dim lSum As Long
- Dim bTemp As Byte
- '检测参数是否是数字
- If lNumber Like "*[.Ee]*" Then Exit Function
- If Not VBA.IsNumeric(lNumber) Then Exit Function
- Dim arr()
- ReDim arr(1 To Len(lNumber))
- For i = 1 To UBound(arr)
- arr(i) = Val(Mid(lNumber, i, 1))
- Next
- QuickSort arr
- strMax = getMax(arr)
- strMin = getMin(arr)
- End Function
- Public Sub QuickSort(ByRef lngArray)
- Dim iLBound As Long
- Dim iUBound As Long
- Dim iTemp As Long
- Dim iOuter As Long
- Dim iMax As Long
- iLBound = LBound(lngArray)
- iUBound = UBound(lngArray)
- '若只有一个值,不排序
- iMax = 1
- If (iUBound - iLBound) Then
- For iOuter = iLBound To iUBound
- If lngArray(iOuter) > lngArray(iMax) Then iMax = iOuter
- Next iOuter
- iTemp = lngArray(iMax)
- lngArray(iMax) = lngArray(iUBound)
- lngArray(iUBound) = iTemp
- '开始快速排序
- InnerQuickSort lngArray, iLBound, iUBound
- End If
- End Sub
- Private Sub InnerQuickSort(ByRef lngArray, ByVal iLeftEnd As Long, ByVal iRightEnd As Long)
- Dim iLeftCur As Long
- Dim iRightCur As Long
- Dim iPivot As Byte
- Dim iTemp As Byte
- If iLeftEnd >= iRightEnd Then Exit Sub
- iLeftCur = iLeftEnd
- iRightCur = iRightEnd + 1
- iPivot = lngArray(iLeftEnd)
- Do
- Do
- iLeftCur = iLeftCur + 1
- Loop While lngArray(iLeftCur) < iPivot
- Do
- iRightCur = iRightCur - 1
- Loop While lngArray(iRightCur) > iPivot
- If iLeftCur >= iRightCur Then Exit Do
- '交换值
- iTemp = lngArray(iLeftCur)
- lngArray(iLeftCur) = lngArray(iRightCur)
- lngArray(iRightCur) = iTemp
- Loop
- '递归快速排序
- lngArray(iLeftEnd) = lngArray(iRightCur)
- lngArray(iRightCur) = iPivot
- InnerQuickSort lngArray, iLeftEnd, iRightCur - 1
- InnerQuickSort lngArray, iRightCur + 1, iRightEnd
- End Sub
- Function getMax(ByRef arr) As String
- getMax = StrReverse(Join(arr, ""))
- End Function
- Function getMin(ByRef arr) As String
- getMin = Join(arr, "")
- End Function
复制代码 |
|