注冊 登錄
Office中國論壇/Access中國論壇 返回首頁

ganlinlao的個人空間 http://m.mzhfr.cn/?230471 [收藏] [復(fù)制] [分享] [RSS]

日志

VB6中c函數(shù)庫QuickSort()無法正確排序 Double,Currency類型的處理方法。

熱度 1已有 851 次閱讀2023-2-21 11:15 |個人分類:vb入門

對于少部分還在使用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毫秒左右)

發(fā)表評論 評論 (1 個評論)

回復(fù) tmtony 2023-10-12 10:25
    厲害!

facelist doodle 涂鴉板

您需要登錄后才可以評論 登錄 | 注冊

QQ|站長郵箱|小黑屋|手機版|Office中國/Access中國 ( 粵ICP備10043721號-1 )  

GMT+8, 2025-7-13 03:17 , Processed in 0.059452 second(s), 18 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回頂部