|
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件 ★ 免费下载 ★ ★ 使用帮助★
本帖最后由 loquat 于 2015-6-8 11:55 编辑
仅仅针对Long类型的数据来做排序算法的话,我目前见过的最快的算法如下。
欢迎也希望大侠能指点
这个排序仅仅对整数数组效率比较好,对字符串或者浮点数都没有较高效率
主要是swap在字符串和浮点数时,会大大降低效率,我的理解应该是这样
代码一是完全的API算法,调用msvcrt.dll里的qsort函数,在IDE界面下大部分情况下优势相当明显
代码二是纯VB算法,在VB编译后的情况下比代码一还要强大,且各种类型的数据表现都大体一致
另,发一个各种快排代码的比拼。。。
DualPivotQuickSortCountComparisons.zip
(144.45 KB, 下载次数: 196)
附件是VB工程,工程里已经验证了排序结果,不需要再另外验证。
具体有问题请vbgood相关帖子,链接一个:ht【补丁】tp://ww【补丁】w.vbgood.c【补丁】om/thread-141406-1-1.h【补丁】tml
- Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
- Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
- Private Declare Function FreeLibrary Lib "kernel32.dll" (ByVal hLibModule As Long) As Long
- Private Declare Function GetProcAddress Lib "kernel32.dll" (ByVal hModule As Long, ByVal lpProcName As String) As Long
- Private m_bCode(42) As Byte, m_hMod As Long, m_lpFunc As Long
- Friend Sub QuickSort(idxArray() As Long, ByVal nStart As Long, ByVal nEnd As Long)
- If nEnd - nStart <= 1 Then Exit Sub
- If m_lpFunc Then
- CallWindowProc VarPtr(m_bCode(0)), VarPtr(idxArray(nStart)), nEnd - nStart + 1, m_lpFunc, 0
- Exit Sub
- End If
- End Sub
- Private Sub Class_Initialize()
- Dim s As String, m As Long, i As Long
- m_hMod = LoadLibrary("msvcrt.dll")
- m_lpFunc = GetProcAddress(m_hMod, "qsort")
- s = "89E0E800000000830424156A04FF7008" + _
- "FF7004FF500C83C410C21000" + _
- "8B4C24048B4424088B108B0129D0C3"
- m = Len(s) \ 2
- For i = 0 To m - 1
- m_bCode(i) = CLng("&H" + Mid(s, i + i + 1, 2))
- Next i
- End Sub
- Private Sub Class_Terminate()
- FreeLibrary m_hMod
- End Sub
复制代码- Public Sub QSort2(ByRef key_arr() As Long, L As Long, R As Long)
- Dim i As Long, j As Long
- Dim x As Long, Swap As Long
- Const k As Long = 60
- If R - L <= k Then
- For i = L + 1 To R
- x = key_arr(i)
-
- For j = i - 1 To L Step -1
- If key_arr(j) <= x Then Exit For
- key_arr(j + 1) = key_arr(j)
- Next
- key_arr(j + 1) = x
- Next
- Else
- x = key_arr((L + R) \ 2)
- i = L
- j = R
- Do While i <= j
- Do While key_arr(i) < x
- i = i + 1
- Loop
-
- Do While key_arr(j) > x
- j = j - 1
- Loop
-
- If i <= j Then
- Swap = key_arr(i)
- key_arr(i) = key_arr(j)
- key_arr(j) = Swap
- i = i + 1
- j = j - 1
- End If
- Loop
- '递归方法
- If L < j Then
- Do While key_arr(j) = x
- j = j - 1
- If j = L Then Exit Do
- Loop
- Call QSort2(key_arr, L, j)
- End If
- If i < R Then
- Do While key_arr(i) = x
- i = i + 1
- If i = R Then Exit Do
- Loop
- Call QSort2(key_arr, i, R)
- End If
- End If
- End Sub
复制代码
|
|