开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 460|回复: 10
收起左侧

[已解决] 排序键数组,换成易代码,最好是汇编,有哪位帮忙弄下?

 关闭 [复制链接]
结帖率:96% (105/109)
发表于 2025-11-29 07:28:10 | 显示全部楼层 |阅读模式   浙江省宁波市
30精币
哈希表不适合高速循环使用,容易闪退,我想把它换成易代码,最好是汇编的,有哪位大佬帮助弄下?
思路如下:只排序键数组(从小到大排序),值跟键永远绑定在一起的。
键排序思路.png

排序键.e

26.79 KB, 下载次数: 7

最佳答案

查看完整内容

你的场景可能更合适冒泡排序,虽然冒泡排序速度较慢,但是它不需要额外的内存,开销更小,合适少量数据,直接对数组进行原地排序。 还有其它更多的排序算法,速度都比冒泡排序快很多,但是都要几乎都要额外的内存开销(申请、释放内存) [e=1] .版本 2 .支持库 spec .子程序 子程序1 .局部变量 键名, 整数型, , "0" .局部变量 键值, 整数型, , "0" 键名 = { 4, 1, 3, 2 } 键值 = { 7777, 5555, 8888, 6666 } .计次循环首 (10000 ...

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值

结帖率:100% (53/53)

签到天数: 2 天

发表于 2025-11-29 07:28:11 | 显示全部楼层   福建省宁德市
你的场景可能更合适冒泡排序,虽然冒泡排序速度较慢,但是它不需要额外的内存,开销更小,合适少量数据,直接对数组进行原地排序。

还有其它更多的排序算法,速度都比冒泡排序快很多,但是都要几乎都要额外的内存开销(申请、释放内存)
  
子程序名返回值类型公开备 注
子程序1  
变量名类 型静态数组备 注
键名整数型0
键值整数型0
键名 = { 4, 1, 3, 2 }
键值 = { 7777, 5555, 8888, 6666 }
计次循环首 (10000000, )
' 测试使用,这样初始化数组更快,少去申请、释放内存过程
键名 [1] = 4
键名 [2] = 1
键名 [3] = 3
键名 [4] = 2
键值 [1] = 7777
键值 [2] = 5555
键值 [3] = 8888
键值 [4] = 6666
排序键_冒泡ASM (键名, 键值)  ' 236ms
' 排序键_冒泡 (键名, 键值)  ' 1339ms
计次循环尾 ()
调试输出 (键名, 键值)
子程序名返回值类型公开备 注
排序键_冒泡 比汇编慢4-5倍左右
参数名类 型参考可空数组备 注
键名整数型
键值整数型
变量名类 型静态数组备 注
成员数整数型 
最后位置整数型 
I整数型 
成员数 = 取数组成员数 (键名)
判断循环首 (成员数 > 0)
最后位置 = 0
变量循环首 (1, 成员数 - 1, 1, I)
如果真 (键名 [I] > 键名 [I + 1])
交换变量 (键名 [I], 键名 [I + 1])
交换变量 (键值 [I], 键值 [I + 1])
最后位置 = I

变量循环尾 ()
成员数 = 最后位置
判断循环尾 ()
子程序名返回值类型公开备 注
排序键_冒泡ASM  
参数名类 型参考可空数组备 注
键名整数型
键值整数型
置入代码 ({ 85, 139, 117, 8, 139, 54, 141, 118, 8, 139, 125, 12, 139, 63, 141, 127, 8, 139, 78, 252, 131, 249, 2, 124, 68, 59, 79, 252, 117, 63, 193, 225, 2, 131, 233, 4, 131, 249, 0, 126, 52, 49, 237, 49, 219, 57, 203, 125, 40, 131, 195, 4, 139, 68, 30, 252, 59, 4, 30, 126, 240, 139, 20, 30, 137, 4, 30, 137, 84, 30, 252, 139, 68, 31, 252, 139, 20, 31, 137, 4, 31, 137, 84, 31, 252, 137, 221, 235, 212, 137, 233, 235, 199, 93 })
' __asm{
' ; push ebp
' ; ;键名[1]地址
' ; mov esi,dword [ebp+8]
' ; mov esi,dword [esi]
' ; lea esi,dword [esi+8]
' ; ;键值[1]地址
' ; mov edi,dword [ebp+12]
' ; mov edi,dword [edi]
' ; lea edi,dword [edi+8]
' ; ;ecx = 取数组成员数(键名)
' ; mov ecx,dword [esi-4]
' ; cmp ecx,2
' ; jl 结束
' ; cmp ecx,dword [edi-4]
' ; jne 结束
' ; shl ecx,2
' ; sub ecx,4
' ; 判断循环首:
' ; cmp ecx,0
' ; jle 结束
' ; xor ebp,ebp
' ; ;------------
' ;    xor ebx,ebx
' ;    变量循环首:
' ;    cmp ebx,ecx
' ;    jge 变量循环尾
' ;    add ebx,4
' ;    mov eax,dword [esi+ebx-4]
' ;    cmp eax,dword [esi+ebx]
' ;    jng 变量循环首
' ;    ;交换键名
' ;    mov edx,dword [esi+ebx]
' ;    mov dword [esi+ebx],eax
' ;    mov dword [esi+ebx-4],edx
' ;    ;交换键值
' ;    mov eax,dword [edi+ebx-4]
' ;    mov edx,dword [edi+ebx]
' ;    mov dword [edi+ebx],eax
' ;    mov dword [edi+ebx-4],edx
' ;    mov ebp,ebx
' ;    jmp 变量循环首
' ;    变量循环尾:
' ; mov ecx,ebp
' ; jmp 判断循环首
' ; 结束:
' ; pop ebp
' }



i支持库列表   支持库注释   
spec特殊功能支持库

评分

参与人数 1荣誉 +1 收起 理由
笨潴 + 1 热心帮助他人,荣誉+1,希望继续努力(*^__^*) 嘻嘻!

查看全部评分

回复

使用道具 举报

结帖率:100% (26/26)
发表于 2025-11-29 07:43:05 | 显示全部楼层   福建省厦门市
不是编汇的我可以 先占楼
回复

使用道具 举报

结帖率:100% (26/26)
发表于 2025-11-29 07:46:06 | 显示全部楼层   福建省厦门市
模块呢~~~~
回复

使用道具 举报

结帖率:100% (26/26)
发表于 2025-11-29 07:57:39 | 显示全部楼层   福建省厦门市
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
排序键 ({ 4, 1, 3, 2 }, { 7777, 5555, 8888, 6666 })
子程序名返回值类型公开备 注
排序键 键组和值组的成员数一致
参数名类 型参考可空数组备 注
键数组整数型要排序的键,到小到大排序
值数组整数型值跟键永远绑定在一起的
变量名类 型静态数组备 注
i整数型 
新键数组整数型0
引导数组整数型0
ZxcArray排序z (键数组, , 新键数组, 引导数组, )
计次循环首 (取数组成员数 (新键数组), i)
调试输出 (“键 ”到文本 (新键数组 [i])“ 值 ”到文本 (值数组 [到整数 (引导数组 [i])]))
计次循环尾 ()
' 哈希表.创建 (#整数型, #整数型, , , , , 真, )
' 调试输出 (“----------排序键前----------”)
' 调试输出 (“键:”, 键数组)
' 调试输出 (“值:”, 值数组)
. ' 计次循环首 (取数组成员数 (键数组), i)
' 哈希表.有序_添加 (键数组 [i], 值数组 [i], , )
. ' 计次循环尾 ()
' 哈希表.有序_排序键 ()
' 哈希表.取所有键值 (键数组, 值数组, )
' 调试输出 (“----------排序键后----------”)
' 调试输出 (“键:”, 键数组)
' 调试输出 (“值:”, 值数组)
子程序名返回值类型公开备 注
ZxcArray排序z 参数1 参数2 二选一 都有值优先 参数1 主要返回 参数4
参数名类 型参考可空数组备 注
整数型_数组整数型
文本型数字_数组文本型
返回整数型_数组值_不能与参1同整数型
返回整数型_数组排序用整数型
大到小_默认小到大逻辑型
变量名类 型静态数组备 注
i整数型 
cys整数型 
原数组整数型0
计次整数型 
ii整数型 
对比次数整数型 
清除数组 (返回整数型_数组值_不能与参1同)
清除数组 (返回整数型_数组排序用)
如果真 (是否为空 (整数型_数组) 是否为空 (文本型数字_数组))
信息框 (“原数组 二选一”, 0, , )
返回 ()
cys = 取数组成员数 (整数型_数组)
如果 (cys > 0)
原数组 = 整数型_数组
cys = 取数组成员数 (文本型数字_数组)
如果真 (cys > 0)
清除数组 (原数组)
计次循环首 (cys, i)
加入成员 (原数组, 到整数 (文本型数字_数组 [i]))
计次循环尾 ()

如果 (大到小_默认小到大 = )  ' ====================== 从小到大
计次 = 0
对比次数 = 0
循环判断首 ()
计次 = 计次 + 1
计次循环首 (cys, i)
计次循环首 (cys, ii)
如果真 (原数组 [i] < 原数组 [ii])
对比次数 = 对比次数 + 1

计次循环尾 ()
如果真 (对比次数 = cys - 计次)
加入成员 (返回整数型_数组值_不能与参1同, 原数组 [i])
加入成员 (返回整数型_数组排序用, i)
对比次数 = 0
计次循环尾 ()
循环判断尾 (取数组成员数 (返回整数型_数组值_不能与参1同) < cys)返回 ()
计次 = 0
对比次数 = 0
循环判断首 ()
计次 = 计次 + 1
计次循环首 (cys, i)
计次循环首 (cys, ii)
如果真 (原数组 [i] > 原数组 [ii])
对比次数 = 对比次数 + 1

计次循环尾 ()
如果真 (对比次数 = cys - 计次)
加入成员 (返回整数型_数组值_不能与参1同, 原数组 [i])
加入成员 (返回整数型_数组排序用, i)
对比次数 = 0
计次循环尾 ()
循环判断尾 (取数组成员数 (返回整数型_数组值_不能与参1同) < cys)
返回 ()


i支持库列表   支持库注释   
spec特殊功能支持库

排序键.e

49.81 KB, 下载次数: 3

2.png
回复

使用道具 举报

结帖率:100% (1/1)
发表于 2025-11-29 13:29:27 | 显示全部楼层   浙江省温州市
排序的性能取决于算法, 而不是写法, 跟是否使用汇编, 关系不大.非要用汇编, 可以参考下面的方法:
使用缩小增量法改善 “数组_排序1” 的性能_精易论坛
  
数据类型名公开备 注
排序对象 
成员名类 型传址数组备 注
整数型  
整数型  

  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
子程序名返回值类型公开备 注
希尔排序  
参数名类 型参考可空数组备 注
数组排序对象
置入代码 ({ 139, 69, 8, 139, 8, 139, 65, 4, 137, 69, 236, 184, 1, 0, 0, 0, 57, 69, 236, 124, 14, 141, 4, 64, 64, 235, 245, 187, 3, 0, 0, 0, 153, 247, 251, 133, 192, 126, 94, 107, 208, 252, 137, 85, 224, 137, 194, 57, 85, 236, 126, 231, 141, 60, 145, 139, 92, 145, 8, 137, 125, 240, 137, 93, 228, 137, 211, 57, 216, 126, 10, 139, 117, 228, 66, 137, 116, 153, 8, 235, 222, 137, 223, 139, 117, 240, 41, 199, 137, 125, 220, 139, 125, 224, 139, 124, 62, 8, 137, 125, 232, 139, 125, 228, 139, 117, 232, 139, 54, 57, 55, 125, 214, 139, 93, 240, 139, 117, 232, 137, 115, 8, 139, 93, 224, 1, 93, 240, 139, 93, 220, 235, 190, 201, 194, 4, 0 })
' mov eax, DWORD PTR [ebp+8]
' mov ecx, DWORD PTR [eax]
' mov eax, DWORD PTR [ecx+4]
' mov DWORD PTR [ebp-20], eax
' mov eax, 1
' L2:
' cmp DWORD PTR [ebp-20], eax
' jl L4
' lea eax, [eax+eax*2]
' inc eax
' jmp L2
' L14:
' mov ebx, 3
' cdq
' idiv ebx
' L4:
' test eax, eax
' jle L1
' imul edx, eax, -4
' mov DWORD PTR [ebp-32], edx
' mov edx, eax
' L7:
' cmp DWORD PTR [ebp-20], edx
' jle L14
' lea edi, [ecx+edx*4]
' mov ebx, DWORD PTR [ecx+8+edx*4]
' mov DWORD PTR [ebp-16], edi
' mov DWORD PTR [ebp-28], ebx
' mov ebx, edx
' L5:
' cmp eax, ebx
' jle L6
' L9:
' mov esi, DWORD PTR [ebp-28]
' inc edx
' mov DWORD PTR [ecx+8+ebx*4], esi
' jmp L7
' L6:
' mov edi, ebx
' mov esi, DWORD PTR [ebp-16]
' sub edi, eax
' mov DWORD PTR [ebp-36], edi
' mov edi, DWORD PTR [ebp-32]
' mov edi, DWORD PTR [esi+8+edi]
' mov DWORD PTR [ebp-24], edi
' mov edi, DWORD PTR [ebp-28]
' mov esi, DWORD PTR [ebp-24]
' mov esi, DWORD PTR [esi]
' cmp DWORD PTR [edi], esi
' jge L9
' mov ebx, DWORD PTR [ebp-16]
' mov esi, DWORD PTR [ebp-24]
' mov DWORD PTR [ebx+8], esi
' mov ebx, DWORD PTR [ebp-32]
' add DWORD PTR [ebp-16], ebx
' mov ebx, DWORD PTR [ebp-36]
' jmp L5
' L1:
' leave
' ret 4
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
变量名类 型静态数组备 注
键数组整数型0要排序的键,到小到大排序
值数组整数型0值跟键永远绑定在一起的
排序数组排序对象0
整数型 
键数组 = { 4, 1, 3, 2 }
值数组 = { 7777, 5555, 8888, 6666 }
重定义数组 (排序数组, 假, 取数组成员数 (键数组))
计次循环首 (取数组成员数 (排序数组), 数)
排序数组 [].键 = 键数组 []
排序数组 [].值 = 值数组 []
调试输出 (排序数组 [].键, 排序数组 [].值)
计次循环尾 ()
调试输出 (“------”)
希尔排序 (排序数组)
计次循环首 (取数组成员数 (排序数组), 数)
调试输出 (排序数组 [].键, 排序数组 [].值)
计次循环尾 ()


i支持库列表   支持库注释   
spec特殊功能支持库

开始运行被调试程序
* 4 | 7777
* 1 | 5555
* 3 | 8888
* 2 | 6666
* “------”
* 1 | 5555
* 2 | 6666
* 3 | 8888
* 4 | 7777
被调试易程序运行完毕

例子.zip (2.27 KB, 下载次数: 4)
回复

使用道具 举报

结帖率:100% (1/1)

签到天数: 2 天

发表于 2025-11-29 13:34:00 | 显示全部楼层   江西省南昌市
  
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
排序键 ({ 4, 1, 3, 2 }, { 7777, 5555, 8888, 6666 })
子程序名返回值类型公开备 注
排序键 键组和值组的成员数一致
参数名类 型参考可空数组备 注
键数组整数型要排序的键,到小到大排序
值数组整数型值跟键永远绑定在一起的
变量名类 型静态数组备 注
键数组1整数型0
值数组1整数型0
键数组1 = 键数组
值数组1 = 值数组
数组排序 (键数组1, )
数组排序 (值数组1, )
调试输出 (“——————排序前——————”)
调试输出 (键数组, 值数组)
调试输出 (“——————排序后——————”)
调试输出 (键数组1, 值数组1)
开始运行被调试程序
* “——————排序前——————”
* 数组:4{4,1,3,2} | 数组:4{7777,5555,8888,6666}
* “——————排序后——————”
* 数组:4{1,2,3,4} | 数组:4{5555,6666,7777,8888}
被调试易程序运行完毕


i支持库列表   支持库注释   
spec特殊功能支持库


这个原生易语言命令,速度极快,最主要的是简单易懂

回复

使用道具 举报

结帖率:100% (1/1)

签到天数: 2 天

发表于 2025-11-29 13:40:22 | 显示全部楼层   江西省南昌市
测试后这个命令应该属于汇编类型的,原生命令看不到代码
wjklw.png
回复

使用道具 举报

结帖率:96% (105/109)
 楼主| 发表于 2025-11-29 17:33:58 | 显示全部楼层   浙江省宁波市
循环1000万次测速:
ZxcArray排序键,耗时:23613
Hasn排序键,耗时:4329
排序键_冒泡ASM,耗时:149
希尔排序,耗时:919

回复

使用道具 举报

结帖率:96% (105/109)
 楼主| 发表于 2025-11-29 17:34:39 | 显示全部楼层   浙江省宁波市
zzoo1314 发表于 2025-11-29 07:57
[e=2].版本 2
.支持库 spec

还是感谢您的热情!
回复

使用道具 举报

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

本版积分规则 致发广告者

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

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

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