VB打造通用排序方法

     C中的通用排序函数qsort真是个令我们这些垂死挣扎在vb代码中的人嫉妒的神通的金钥匙.
想想一个qsort函数排序遍所有数据类型而且效率也挺好难道不爽快没?...痛啊!
      .Net的FrameWorke 1.1也通过装箱(boxing)、拆箱(unboxing)机制和Object类是所有子类
的根类实现了Array类的通用Sort方法;C++可以用摸板来打造通用的排序方法;C#2.0以上可以通过
泛型类打造通用的排序方法.尽管它们实现的方法或许效率不是很好或许可能使你的程序越来越庞
大,但仍不失为一种灵活的机制.
      而vb呢?c的__cdecl不能调用(即使能调用也实现不了__cdecl形的比较函数)所以qsort的光
一点也沾不了?C++摸板、C#2.0泛型?vb编译器不支持要想实现也不难自己把所有的数据类型都写一
份呗!难道vb就不能在这方面占点边吗?当然能拉!(废话!)

      在.Net的FrameWorke 1.1中的Array类中的Sort方法(具有IComparer类型的形参的)是建立
在.Net装箱、拆箱基础上的.由于所有类最终的基类都是Object类所以可以通过Object来传输所
有数据类型(其中的实现通过装箱、拆箱来实现)。要是想给自定义的数据类型的数组进行排序则
必须自己实现一个继承自IComparer接口的类,IComparer接口的定义如下
	public interface IComparer
	{
      		int Compare(object x, object y);
	}
实现了IComparer接口类只要调用Array类中具IComparer类型的形参的Sort方法就ok了?
	
	总结一下.以上思想在.net中之所以如此容易实现完全是因为Object类可以传输所有的数
据类型.那么如果vb中也有一个Object一样的数据类型不就可以实现我们伟大的革命理想了吗?对!
那就是Variant变量,虽然Variant不能像Object那样神通的支持所有的数据类型但它完全支持vb中
的所有标准数据类型所以还是能满足了点点的吧.
	一下是我在vb中的实现思路:
	1,定义一个排序方法.其中必须传递两个参数:一个为数组,一个为Object类型的比较类的
	  对象(因为Oject对象在vb中可以传输所有对象),排序中遇到的比较约定调用比较类的
	  Compare方法;
	2,必须是现一个比较类.此类中必须实现原形为Function Compare(c1 As Variant, c2 As
	 Variant) As Long的比较函数.

ok!以下是具体实现的代码:

'-------------------------------------------------------------------------
'   通用的直接插入排序方法模块mSort
'-------------------------------------------------------------------------
'   通用的直接插入排序方法
Sub InsertSort(List As Variant, CmpClass As Object)
    Dim I As Long, J As Long
    Dim Frist As Long, Last As Long
    Dim dwTemp As Variant
    If IsArray(List) = False Then Exit Sub
    Frist = LBound(List)
    Last = UBound(List)

    Frist = Frist + 1

    For I = Frist To Last
        dwTemp = List(I)
        J = I
        Do While J >= Frist
            If CmpClass.Compare(List(J - 1), dwTemp) <= 0 Then Exit Do
            List(J) = List(J - 1)
            J = J - 1
        Loop
        List(J) = dwTemp
    Next
End Sub

'-------------------------------------------------------------------------
'   比较类cCmpFn
'-------------------------------------------------------------------------
'比较函数
Function Compare(c1 As Variant, c2 As Variant) As Long
    Compare = c1 - c2
End Function


'-------------------------------------------------------------------------
'  测试模块
'-------------------------------------------------------------------------
Const BTM = 100
'Private test(BTM) As Currency '
'Private test(BTM) As Long
Private Test(BTM) As Integer

Private Sub btnOrder_Click()
    Dim cmp As New cCmpFn
    Call mSort.InsertSort(Test, cmp)

    Call ReadArrayData2TextBox(txtDst, Test)
End Sub

Private Sub btnRfh_Click()
    Call Form_Load
End Sub

Private Sub Form_Load()
    Dim I As Long

    For I = 0 To BTM
        Test(I) = Rnd * BTM
    Next

    Call ReadArrayData2TextBox(txtSrc, Test)
End Sub

Private Sub ReadArrayData2TextBox(Tb As TextBox, Arr As Variant)
    Dim I As Long
    Dim buffer$
    For I = 0 To BTM
        buffer = buffer & Space$(2) & Arr(I)
        If (I + 1) Mod 5 = 0 Then buffer = buffer & vbCrLf '每行10个元素
    Next

    Tb.Text = buffer
End Sub

代码示例中(还是实现了字符串的排序):下载
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值