Option ExplicitPrivate Const SortString            As String = "5589E5608B75088B7D0C4F31C98B048E89CA428B1C9639D87C08891C8E89049689D839FA75EC4139F97CE261C9C21000"
Private Const SortLength            As Long = 48Private Declare Function CallWindowProc Lib "user32" 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 GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (ByRef Ptr() As Any) As Long
Private Const GMEM_FIXED = &H0
Private Const GMEM_ZEROINIT = &H40
Private Const GPTR = (GMEM_FIXED Or GMEM_ZEROINIT)Private SortMemory              As LongPrivate Sub Class_Initialize()
    Dim X           As Long, Y          As Long
    ReDim Buffer(1 To SortLength) As Byte
    X = 1
    Do While Y < SortLength
        Y = Y + 1
        Buffer(Y) = Val("&H" & Mid(SortString, X, 2))
        X = X + 2
    Loop
    SortMemory = GlobalAlloc(GPTR, SortLength)
    CopyMemory ByVal SortMemory, Buffer(1), SortLength
End SubPrivate Sub Class_Terminate()
    GlobalFree SortMemory
End SubPublic Function BubbleSort(Data() As Long) As Boolean
    Dim Length      As Long
    Length = UBound(Data) - LBound(Data) + 1
    CallWindowProc SortMemory, VarPtr(Data(LBound(Data))), Length, 0, 0
End Function
在网络上淘的,共享给大家。
简单的几行代码,比VB本土的冒泡排序效率高了很多倍,崇拜中。

解决方案 »

  1.   

    我怀疑这个排序的速度当排十万条数据的时候比不上
    ·先把要排序的数据写到一个临时的文本文件
    ·Shell调用C语言写的qsort.exe
    ·qsort.exe是用C语言写的从临时文本文件读入数据,调用qsort函数排序,将排好序的数据写入另一个文本文件
    ·VB从结果文本文件中读入排序结果
    的速度快。
      

  2.   

    IDA反了下……………………
    push    ebp
    seg000:00000001                 mov     ebp, esp
    seg000:00000003                 pusha
    seg000:00000004                 mov     esi, [ebp+arg_0]
    seg000:00000007                 mov     edi, [ebp+arg_4]
    seg000:0000000A                 dec     edi
    seg000:0000000B                 xor     ecx, ecx
    seg000:0000000D
    seg000:0000000D loc_D:                                  ; CODE XREF: sub_0+29j
    seg000:0000000D                 mov     eax, [esi+ecx*4]
    seg000:00000010                 mov     edx, ecx
    seg000:00000012
    seg000:00000012 loc_12:                                 ; CODE XREF: sub_0+24j
    seg000:00000012                 inc     edx
    seg000:00000013                 mov     ebx, [esi+edx*4]
    seg000:00000016                 cmp     eax, ebx
    seg000:00000018再反成C的。
    __int64 __fastcall sub_0(__int64 a1, int a2, int a3, int a4, int a5, int a6, int a7)
    {
      int v5; // ecx@1
      int v6; // edi@1
      int v7; // esi@1
      __int64 v8; // ST00_8@1
      int v9; // eax@2
      int v10; // edx@2
      int v11; // ebx@3  v8 = a1;
      v7 = a4;
      v6 = a5 - 1;
      v5 = 0;
      do
      {
        v9 = *(_DWORD *)(v7 + 4 * v5);
        v10 = v5;
        do
        {
          ++v10;
          v11 = *(_DWORD *)(v7 + 4 * v10);
          if ( v9 >= v11 )
          {
            *(_DWORD *)(v7 + 4 * v5) = v11;
            *(_DWORD *)(v7 + 4 * v10) = v9;
            v9 = v11;
          }
        }
        while ( v10 != v6 );
        ++v5;
      }
      while ( v5 < v6 );
      return v8;
    }
      

  3.   

    汇编没好。。
    seg000:00000000                 push    ebp
    seg000:00000001                 mov     ebp, esp
    seg000:00000003                 pusha
    seg000:00000004                 mov     esi, [ebp+arg_0]
    seg000:00000007                 mov     edi, [ebp+arg_4]
    seg000:0000000A                 dec     edi
    seg000:0000000B                 xor     ecx, ecx
    seg000:0000000D
    seg000:0000000D loc_D:                                  ; CODE XREF: sub_0+29j
    seg000:0000000D                 mov     eax, [esi+ecx*4]
    seg000:00000010                 mov     edx, ecx
    seg000:00000012
    seg000:00000012 loc_12:                                 ; CODE XREF: sub_0+24j
    seg000:00000012                 inc     edx
    seg000:00000013                 mov     ebx, [esi+edx*4]
    seg000:00000016                 cmp     eax, ebx
    seg000:00000018 jl      short loc_22
    seg000:0000001A                 mov     [esi+ecx*4], ebx
    seg000:0000001D                 mov     [esi+edx*4], eax
    seg000:00000020                 mov     eax, ebx
    seg000:00000022
    seg000:00000022 loc_22:                                 ; CODE XREF: seg000:00000018j
    seg000:00000022                 cmp     edx, edi
    seg000:00000024                 jnz     short loc_12
    seg000:00000026                 inc     ecx
    seg000:00000027                 cmp     ecx, edi
    seg000:00000029                 jl      short loc_D
    seg000:0000002B                 popa
    seg000:0000002C                 leave
    seg000:0000002D                 retn    10h