對于少部分還在使用vb6的人來說,調(diào)用cdecl協(xié)議的函數(shù),聲明或用VB寫帶cdecl協(xié)議的函數(shù),一般盡量放在 模塊中,
但msvcrt中的quirkcSort()函數(shù) 對Double或Currency等帶小數(shù)點的類型,無法正確排序,關(guān)鍵問題是出在 comparator
因為 comparator 要求返回值是long,所以我們要增加 comparator= IIF((a-b)>0,1,-1) 讓返回 1或-1 這樣的long值,
這樣就能正確排序,雖然調(diào)用IIF(),是會影響性能,但依然是在我們能承受的范圍。
以下以long和double為例子,排序20萬條數(shù)字。
模塊中:
Public Declare Function GetTickCount Lib "kernel32" () As Long
Public Declare Sub qsort CDecl Lib "msvcrt" ( _
ByRef pFirst As Any, _
ByVal lNumber As Long, _
ByVal lSize As Long, _
ByVal pfnComparator As Long)
Public Function Comparator CDecl(ByRef a _
As Double, ByRef b _
As Double) As Long
Comparator = IIf((a - b) > 0, 1, -1)
End Function
窗體中放入一個command按鈕
Private Sub Command1_Click()
Dim z() As Double
Dim i As Long
Dim s As String
Dim t1 As Long
t1 = GetTickCount()
ReDim z(200000)
Randomize
For i = 0 To UBound(z)
z(i) = CDbl((Rnd * 100))
Next
qsort z(0), UBound(z) + 1, LenB(z(0)), AddressOf Comparator
MsgBox "20萬Double排序計時:" & GetTickCount() - t1 & "毫秒"
For i = 199991 To UBound(z) '為節(jié)省時間,二十萬個數(shù)據(jù)取最后10個數(shù)據(jù)看一下
Debug.Print z(i)
Next
End Sub
測試結(jié)果:20萬double排序約 500毫秒左右。(編譯成exe,約359毫秒左右)
測試結(jié)果2:20萬long排序約182毫秒左右。(編譯成exe,約46毫秒左右)