网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
05月09日漏签0天
vb吧 关注:156,020贴子:1,166,241
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 1 2 下一页 尾页
  • 19回复贴,共2页
  • ,跳到 页  
<<返回vb吧
>0< 加载中...

源码分享:用“轻量级COM对象”实现的快速排序

  • 只看楼主
  • 收藏

  • 回复
  • 涐吢铱舊囿儚
  • 数据库
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
核心代码模块镇楼。



  • 涐吢铱舊囿儚
  • 数据库
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这贴吧不适合直接放“文本”格式的代码,因此就贴图片了。
等会儿我贴个网盘链接。
但只有这个“模块代码”是不行的,需要在工程中引用我写的那个tlb 才行。
说到底,这个也是通过“接口过程”,去调用ntdll.dll中的“qsort”这个API实现排序的。
也许你会问:那为啥不直接declare 这个API,然后代码中直接调用呢?
…… 
呵呵,这个API是 CDecl调用约定的;
最关键的是:还需要提供一个CDecl调用约定的“回调函数”给它!
就算你在VB6中用“XX大法”实现了可以调用CDecl约定的API,
 但因VB6中的所有过程或函数,都是StcCall约定的,
 直接用VB6的代码写个函数给它回调,只有“进程崩溃”的效果。


2026-05-09 08:43:05
广告
不感兴趣
开通SVIP免广告
  • 涐吢铱舊囿儚
  • 数据库
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我写的这个模块,只对 Long类型的数组进行排序。
Integer类型的数组,需要“改造一下”才可以。
但对Integer类型进行这个“改造”意义不大,毕竟“快速排序”适合处理大量数据,
 而 Integer的“值域范围”都只有那么点儿,它的数组元素“需要排序”的时候,
 能有多少元素呢!随便一个其它的合适排序算法就行了;
 或者你就把数组元素改为Long类型也可。
当然,也许这个“不是最快”的排序接口;
但是,我还是可以肯定:
若用VB6实现的排序算法,只要你不是用“快速排序”算法,不可能比这个快;
就算你用“快速排序”算法写的VB代码,若是“优化”不好,未必能比这个快。
这个模块的使用方法是(当然,你得先在工程中加入本模块、引用对应的TLB):
先调用“创建接口”函数:CreateQSort( )
函数返回0表示成功;-1表示失败。
(创建失败,当然就无法使用排序功能了。但一般来说,失败的概率约为0。)
然后可以按需要,设置“升序排序”或“降序排序”。
只要在代码中执行一句SortOrder = 1或者SortOrder = (其它值) 就行了。
创建接口函数中设置的默认模式是升序排序;
若已经创建成功,后面在工程中重复调用这个接口,都是直接返回(不会改变排序模式)。
然后就可以调用接口过程 QuickSort( ) 对相应的数组元素进行排序了。
此过程,第1个参数是“要排序的数组”,第2个和第3个参数是指定排序的元素范围。
毕竟“大量元素”的动态数组,并不是“所有元素”都是有效的(至少我的代码中经常是这样),
因此我这个接口过程就不是“对整个数组进行排序”了。


  • 涐吢铱舊囿儚
  • 数据库
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
TLB在这个图片中。
把它另存为WinRAR文档,可以解压出来。
里面的那个接口模块是最初的方案,只有升序排序。


  • 涐吢铱舊囿儚
  • 数据库
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
帖子发出来快8小时了,只有一个被“河蟹掉”了的回复。

仅仅是因为这里“冷清”吗……


  • sunruisunrui
  • 小吧主
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
可以在github上面发布代码。


  • daviddyn
  • 数据库
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我感觉有些费力不讨好,快排又不是什么神秘的算法,直接手写一个就成,如果瞧不起VB的速度,也可以自己用C疯一个dll,照样可以用Declare调


  • 晴天云gdh
  • 多线程
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
报道


2026-05-09 08:37:05
广告
不感兴趣
开通SVIP免广告
  • oshi001
  • 钩子编程
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
厉害了


  • ruosha
  • 数据库
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
顶一个


  • 锅巴好不好吃
  • 世界你好
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
看不懂 还是顶一个吧


  • 涐吢铱舊囿儚
  • 数据库
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
回复7楼:
  你这说法,本人不敢苟同。快排算法确实不神秘,网上“遍地都是”代码或相关论述,也可以用VB6“翻译”、或者按“理论”写出对应的代码。我没有在任何地方说过“VB程序慢”,只有多次说过“说用VB写的程序慢的人,那只不过是他的水平不行,写出来的代码质量差、运行效率不高”(大意是这样,不可能在各处的文字都一样,毕竟我不是Ctrl+C、Ctrl+V的)。
  你要说“费力”,也许是吧……也许你只把目光局限于这“排序功能”上了。但即使如此,我把代码和tlb文件都分享给大家了,在“需要”的时候大家都可以直接使用,只需在工程中添加我的代码模块、引用一下我的那个tlb,对你们来说,这又费什么力呢!难道这两步操作很麻烦吗? 要说“不讨好”,真不知如何说起……难道我这个方案,不能达成目的?难道运行效率低了?难道会有“不兼容”的事情?先别说“初学”的能有几个会用C++的,就算你用C++编译个dll来用,这“速度”又能提升几许呢!写个小程序,还不得不拖个dll的“小尾巴”,不觉得别扭呀……
(大家注意:tlb仅“在IDE中运行”、编译时才需要;编译好的exe是不需要tlb就可运行的)
  我的这个模块,在WinXP及更高的系统版本中(估计Win2K也支持),可以说都是没问题的。用我这个代码,不需要“附带”dll文件,因为需要的dll,不仅是“系统必有”,并且在你的VB程序运行时,都已经加载到程序的“进程空间”了!包括那段“快排”的接口API,即使你用VB写了个“什么都不做”的exe,那一段代码在程序运行时,也是“进入了进程空间”的。只不过VB没有C++的那种“函数指针”,你无法直接调用罢了。
  其实大家还应该看到一个“重要问题”:那就是用“Thunck Code + 轻量级COM”的方案,可以突破VB的一些“局限性”,实现一些“意想不到”的事情,并且“运行效率”也是极高的……学会“举一反三、触类旁通”,才是重中之重!


  • Rythm
  • API
    12
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
强了...


  • 初音七奈
  • 钩子编程
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
感觉好高级的样子,总之赞一个好了


2026-05-09 08:31:05
广告
不感兴趣
开通SVIP免广告
  • 涐吢铱舊囿儚
  • 数据库
    10
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 1 2 下一页 尾页
  • 19回复贴,共2页
  • ,跳到 页  
<<返回vb吧
分享到:
©2026 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示