开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

楼主: 帅气与大侠
收起左侧

[易语言纯源码] 快速排序汇编版,超级快

[复制链接]

结帖率:100% (53/53)
 楼主| 发表于 2025-12-12 23:32:38 | 显示全部楼层   福建省宁德市
呵呵仙 发表于 2025-12-12 17:30
不可能快过C++自带排序吧?

当前版本代码和c++的 sort 速度一样,100万都是58ms
目前我又加入了小区间插入排序优化,100万耗时48ms,已经比c++的快了
新版qsort:小区间插入排序+三数取中+尾循环优化
* “排序耗时:” | “487604us” | “48.7604ms”
  
子程序名返回值类型公开备 注
qsort_int  
参数名类 型参考可空数组备 注
数组整数型
' __asm{
' sub esp,4;局部变量
' mov esi,dword [ebp+8]
' mov esi,dword [esi]
' test esi,esi
' jz 结束
' mov edi,dword [esi+4]
' cmp edi,2
' jl 结束
' lea esi,dword [esi+8];起始地址
' lea edi,dword [esi+edi*4-4];终止地址
' push edi
' push esi
' mov dword [ebp-4],2
' 栈是否为空:
' cmp dword [ebp-4],0
' jz 结束
' pop esi
' pop edi
' sub dword [ebp-4],2
' ;小区间<=16使用插入排序,提升≈15%
' mov ebx,edi
' sub ebx,esi
' cmp ebx,60
' jg 取中地址
' lea ebx,dword [esi+4]
' 插入排序:
' cmp ebx,edi
' jg 栈是否为空
' mov edx,dword [ebx]
' lea ecx,dword [ebx-4]
' 插入排序循环:
' cmp ecx,esi
' jl 插入排序尾
' cmp dword [ecx],edx
' jle 插入排序尾
' mov eax,dword [ecx]
' mov dword [ecx+4],eax
' lea ecx,dword [ecx-4]
' jmp 插入排序循环
' 插入排序尾:
' mov dword [ecx+4],edx
' lea ebx,dword [ebx+4]
' jmp 插入排序
' 取中地址:
' mov ebx,edi
' sub ebx,esi
' shr ebx,2
' shr ebx,1
' shl ebx,2
' lea ebx,dword [esi+ebx]
' ;swap(a[m],a[l])
' mov eax,dword [ebx]
' mov ecx,dword [esi]
' mov dword [ebx],ecx
' mov dword [esi],eax
' ;前后指针法分区
' mov ebx,esi
' lea ecx,dword [edi+4]
' mov edx,dword [esi]
' 循环:
' 循环ir:
' lea ebx,dword [ebx+4]
' cmp ebx,edi
' jg 循环jl
' cmp dword [ebx],edx
' jl 循环ir
' 循环jl:
' lea ecx,dword [ecx-4]
' cmp ecx,esi
' jl 循环_是否跳出循环
' cmp dword [ecx],edx
' jg 循环jl
' 循环_是否跳出循环:
' cmp ebx,ecx
' jge 尾优化
' ;swap(i,j)
' push dword [ebx]
' push dword [ecx]
' pop dword [ebx]
' pop dword [ecx]
' jmp 循环
' 尾优化:
' ;swap(l,j)
' push dword [esi]
' push dword [ecx]
' pop dword [esi]
' pop dword [ecx]
' mov eax,ecx
' sub eax,esi
' mov edx,edi
' sub edx,ecx
' cmp eax,edx
' jge L1
' lea eax,dword [ecx-4]
' cmp eax,esi
' jle L2
' push eax
' push esi
' add dword [ebp-4],2
' L2:
' lea eax,dword [ecx+4]
' cmp edi,eax
' jle 栈是否为空
' push edi
' push eax
' add dword [ebp-4],2
' jmp 栈是否为空
' L1:
' lea eax,dword [ecx+4]
' cmp edi,eax
' jle L3
' push edi
' push eax
' add dword [ebp-4],2
' L3:
' lea eax,dword [ecx-4]
' cmp eax,esi
' jle 栈是否为空
' push eax
' push esi
' add dword [ebp-4],2
' jmp 栈是否为空
' 结束:
' leave
' ret
' }



c++的 sort 耗时
ScreenShot_2025-12-12_233144_767.jpg

回复 支持 反对

使用道具 举报

签到天数: 9 天

发表于 2025-12-12 21:09:31 | 显示全部楼层   江苏省连云港市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:25% (1/4)

签到天数: 8 天

发表于 2025-12-12 17:42:32 | 显示全部楼层   四川省泸州市
快速排序汇编版
回复 支持 反对

使用道具 举报

结帖率:100% (34/34)

签到天数: 13 天

发表于 2025-12-12 17:30:22 | 显示全部楼层   广东省惠州市
不可能快过C++自带排序吧?
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)

签到天数: 10 天

发表于 2025-12-12 17:21:22 | 显示全部楼层   广东省深圳市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:100% (76/76)

签到天数: 7 天

发表于 2025-12-12 16:57:31 | 显示全部楼层   重庆市重庆市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:100% (53/53)

签到天数: 7 天

 楼主| 发表于 2025-12-12 16:28:34 | 显示全部楼层   福建省宁德市
kanhaiyouyue 发表于 2025-12-12 15:56
请加个文本数组排序

这就是通用型排序啊,支持整数、小数、文本、字节集、自定义数组排序啊
你只需要通过回调函数判断大小返回就可以了
回复 支持 反对

使用道具 举报

结帖率:77% (56/73)

签到天数: 13 天

发表于 2025-12-12 15:56:14 | 显示全部楼层   湖北省武汉市
请加个文本数组排序
回复 支持 反对

使用道具 举报

结帖率:100% (53/53)

签到天数: 7 天

 楼主| 发表于 2025-12-12 14:32:59 | 显示全部楼层   福建省宁德市
lassgo 发表于 2025-12-12 10:56
汇编写的快排?5精币有点小贵啊,不过要是真快,倒也值了哈~

快不快,论坛里应该找不到比这个快的了
回复 支持 反对

使用道具 举报

结帖率:71% (10/14)

签到天数: 13 天

发表于 2025-12-12 12:11:26 | 显示全部楼层   甘肃省平凉市
快的就是好
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表