文件名称:VB指针葵花宝典之函数指针的配套代码。
文件大小:54KB
文件格式:ZIP
更新时间:2009-04-04 17:46:40
综合系统类
此代码是《VB真是想不到系列之三:VB指针葵花宝典之函数指针》的配套代码。 本系列文章可见: http://www.csdn.net/develop/list_article.asp?author=AdamBear 本代码主要是用来谈函数指针在VB内部的应用之一,给出了qsort和ShellSort的实现。其中ShellSort完全是取自1998年5月VBPJ的Black Belt专栏里的源代码,可以说本文的思想基本上也来自这篇专栏文章。 ShellSort提共了三种不同的实现方法,分别是如下: PolySort1: 用Variant和对象缺省属性来比较。 PolySort2:用ISortable接口的多态对象技术来实现 PolySort3:用函数指针强制回调技术来实现。 分别运行一下这三个程序,可以发现用函数指针是最快的。值得一提作者的钻研精神,完全在VB里实现同一种算法完全三种不同的实现,而且一个比一个好,我非常佩服。 我原以为qsort应该会比它快不少,从算法上来说是这样,不过做出来才发现,要在VB里做出比它快的qsort很难,即使经过了仔细的优化。这是因为qsort的实现上比shellsort复杂,在C里多几次比较、多几次无用的移动影响不大,但在VB里多用一次API回调的Compare、多用一次CopyMemory都是很大的开销。而且qsort要嵌套调用(不嵌套在VB里也慢),我们还要尽量节约堆栈,虽然1M的默认堆栈大小可以被扩充(有相邻的空闲空间时),但是我们依然要考虑可能存在的溢出,所以我做的qsort仅两个参数,两个局部Long型变量。大家可以参考一下我最终的qsort的源代码。 见QSort工程里的basQSort模块,有详细注释。 虽然qsort还是比shellsort慢得多,但是可以说qsort已经进行了较好的优化。可见在VB里一个算法好不好,不能仅仅从理论上看,一个差一点但实现简单的算法和一个好一点但实现上复杂的算法在VB里谁好谁坏很难说。所以从实践意义上,ShellSort的确是个不错的算法。 无论ShellSort还是qsort,它们都还可以更加快,我在文章里说过,那必须要Hack一下SafeArray。 本系列第四篇文章《VB真是想不到系列之三:VB指针葵花宝典之数组指针》里再谈,这篇文章很快就会出来。
【文件预览】:
Qsort
----QSort3.bas(6KB)
----MSSCCPRJ.SCC(190B)
----ShellSort3.bas(2KB)
----modMain.bas(2KB)
----qSort.vbp(828B)
----qSort.vbw(137B)
----modCompareObject.bas(1018B)
PolySort1.exe
SellSort.exe
Common
----Debug.bas(5KB)
ShellSort
----Sorter2.bas(1KB)
----CEmployee1.cls(1KB)
----Form1.frx(97B)
----CEmployee3.cls(874B)
----Sorter3.bas(2KB)
----Form1.frm(6KB)
----Sorter1.bas(2KB)
----PolySort2.vbp(770B)
----PolySort1.vbw(115B)
----listings.txt(5KB)
----Form3.frx(97B)
----Form3.frm(7KB)
----MSSCCPRJ.SCC(488B)
----Form2.frm(6KB)
----PolySort1.vbp(738B)
----PolySort3.vbw(153B)
----CompareRoutines.bas(1KB)
----Readme.txt(522B)
----Form2.frx(97B)
----PolySort2.vbw(150B)
----PolySort3.vbp(783B)
----CEmployee2.cls(2KB)
----ISortable.cls(655B)
----PolySort.vbg(89B)
PolySort2.exe
readme.txt
PolySort3.exe