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
代码示例中(还是实现了字符串的排序):下载
VB打造通用排序方法
最新推荐文章于 2023-10-15 12:03:54 发布
695

被折叠的 条评论
为什么被折叠?



