开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

楼主: sunfly
收起左侧

[已解决] 文本型数字串如何快速排序?

 关闭 [复制链接]
结帖率:100% (2/2)
发表于 2025-2-10 15:41:27 | 显示全部楼层   辽宁省丹东市
  
子程序名返回值类型公开备 注
整数文本排序文本型 
参数名类 型参考可空数组备 注
整数文本字符串文本型
排序方向逻辑型如果参数值为真,排序将从小到大;如果为假,则为从大到小。如果本参数被省略,将默认为真
变量名类 型静态数组备 注
交换逻辑型 
未比数据整数型 
i整数型 
局方向逻辑型 
数组文本型0
如果真 (是否为空 (排序方向))
排序方向 = 真
文本_逐字分割_汇编 (整数文本字符串, 数组)
交换 = 真
未比数据 = 取数组成员数 (数组)
判断循环首 (交换 = )
交换 = 假
变量循环首 (1, 未比数据 - 1, 1, i)
判断 (排序方向 = )
判断 (到整数 (数组 [i + 1])到整数 (数组 [i]))
局方向 = 假
局方向 = 真



判断 (到整数 (数组 [i + 1])到整数 (数组 [i]))
局方向 = 假
局方向 = 真


如果真 (局方向 = )
交换变量 (数组 [i], 数组 [i + 1])
交换 = 真

变量循环尾 ()
未比数据 = 未比数据 - 1
判断循环尾 ()
返回 (数组_合并_快速 (数组))



补充内容 (2025-2-10 15:45):
比大佬的也就慢了几十倍,还有很大的优化空间
回复

使用道具 举报

结帖率:100% (2/2)

签到天数: 14 天

发表于 2025-2-10 16:10:44 | 显示全部楼层   辽宁省丹东市
这次可以超越了
  
子程序名返回值类型公开备 注
整数文本排序文本型 
参数名类 型参考可空数组备 注
整数文本字符串文本型
排序方向逻辑型如果参数值为真,排序将从小到大;如果为假,则为从大到小。如果本参数被省略,将默认为真
变量名类 型静态数组备 注
交换逻辑型 
未比数据整数型 
i整数型 
局方向逻辑型 
数组文本型0
如果真 (是否为空 (排序方向))
排序方向 = 真
文本_逐字分割_汇编 (整数文本字符串, 数组)
' 文本_逐字分割 (整数文本字符串, 数组)
交换 = 真
未比数据 = 取数组成员数 (数组)
判断循环首 (交换 = )
交换 = 假
变量循环首 (1, 未比数据 - 1, 1, i)
判断 (排序方向 = )
判断 (数组 [i + 1] > 数组 [i])
局方向 = 假
局方向 = 真



判断 (数组 [i + 1] < 数组 [i])
局方向 = 假
局方向 = 真


如果真 (局方向 = )
交换变量 (数组 [i], 数组 [i + 1])
交换 = 真

变量循环尾 ()
未比数据 = 未比数据 - 1
判断循环尾 ()
返回 (数组_合并_快速 (数组))

回复

使用道具 举报

结帖率:96% (23/24)

签到天数: 16 天

 楼主| 发表于 2025-2-10 16:37:15 | 显示全部楼层   广东省广州市
算法艺术家 发表于 2025-2-10 16:10
这次可以超越了
[e=3].版本 2

测试随机位数,短长度的和长长度的效率重复10000次排序差不多,
而且弊端是调用了大量的精易命令代码量多了很多
感觉核心库写速度比这个快。
谢谢您的分享帮助

回复

使用道具 举报

结帖率:100% (2/2)

签到天数: 14 天

发表于 2025-2-10 16:54:27 | 显示全部楼层   辽宁省丹东市
sunfly 发表于 2025-2-10 16:37
测试随机位数,短长度的和长长度的效率重复10000次排序差不多,
而且弊端是调用了大量的精易命令代码量多 ...

别着急 等等有可能还有隐藏大佬来奉献
回复

使用道具 举报

结帖率:95% (19/20)

签到天数: 1 天

发表于 2025-2-10 17:36:07 | 显示全部楼层   福建省宁德市
  
子程序名返回值类型公开备 注
文本数字排序_汇编 就地对文本进行ASCII冒泡排序,汇编版
参数名类 型参考可空数组备 注
文本数字文本型
置入代码 ({ 139, 69, 8, 139, 0, 133, 192, 116, 91, 137, 199, 141, 80, 3, 139, 24, 131, 192, 4, 141, 139, 255, 254, 254, 254, 247, 211, 33, 217, 129, 225, 128, 128, 128, 128, 116, 233, 247, 193, 128, 128, 0, 0, 117, 6, 193, 233, 16, 131, 192, 2, 208, 225, 25, 208, 137, 193, 73, 137, 248, 131, 249, 0, 126, 35, 49, 219, 49, 246, 138, 20, 31, 138, 116, 31, 1, 56, 242, 141, 91, 1, 126, 9, 137, 222, 136, 116, 55, 255, 136, 20, 55, 57, 203, 124, 229, 137, 241, 235, 216 })
' mov eax,dword [ebp+8]
' mov eax,dword [eax]
' test eax,eax
' jz 结束
' mov edi,eax
' ;取出文本的长度
' lea edx,[eax+3]
' 读入四字节:
' mov ebx,[eax]
' add eax,4
' lea ecx,[ebx-01010101h]
' not ebx
' and ecx,ebx
' and ecx,80808080h
' jz 读入四字节
' test ecx,00008080h
' jnz 计算长度
' shr ecx,16
' add eax,2
' 计算长度:
' shl cl,1
' sbb eax,edx
' mov ecx,eax ;长度
' dec ecx
' mov eax,edi ;起始
' ;开始冒泡排序
' 判断循环首:
' cmp ecx,0
' jle 结束
' xor ebx,ebx
' xor esi,esi
' 变量循环首:
' mov dl,byte[edi+ebx]
' mov dh,byte [edi+ebx+1]
' cmp dl,dh
' lea ebx,dword [ebx+1]
' jng 变量循环尾
' mov esi,ebx
' mov byte [edi+esi-1],dh
' mov byte [edi+esi],dl
' 变量循环尾:
' cmp ebx,ecx
' jl 变量循环首
' mov ecx,esi
' jmp 判断循环首
' 结束:
子程序名返回值类型公开备 注
文本数字排序_常规 对上面汇编代码的过程翻译,低效率
参数名类 型参考可空数组备 注
文本数字文本型
变量名类 型静态数组备 注
长度整数型 
i整数型 
剩余长度整数型 
c1字节型 
c2字节型 
文本地址整数型 
长度 = 取文本长度 (文本数字)
文本地址 = 取变量数据地址 (文本数字)
判断循环首 (长度 > 0)
剩余长度 = 0
变量循环首 (1, 长度 - 1, 1, i)
c1 = 取代码 (文本数字, i)
c2 = 取代码 (文本数字, i + 1)
如果真 (c1 > c2)
' 交换两个值
写到内存 (c1, 文本地址 + i, )
写到内存 (c2, 文本地址 + i - 1, )
' 记录最后一次交换的位置
剩余长度 = i

变量循环尾 ()
长度 = 剩余长度
判断循环尾 ()


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




补充内容 (2025-2-10 17:38):
a="987654321"
文本数字排序_汇编(a)'注意,参数只能提供变量,不能提供常量,否则编译后崩溃
调试输出(a)'123456789

评分

参与人数 1好评 +1 收起 理由
sunfly + 1 新技能已get√

查看全部评分

回复

使用道具 举报

结帖率:100% (2/2)

签到天数: 14 天

发表于 2025-2-10 17:42:01 | 显示全部楼层   辽宁省丹东市
  
另一个写法
子程序名返回值类型公开备 注
文本串排序文本型 逐字排序
参数名类 型参考可空数组备 注
整数文本字符串文本型
排序方向逻辑型如果参数值为真,排序将从小到大;如果为假,则为从大到小。如果本参数被省略,将默认为真
变量名类 型静态数组备 注
数量整数型 
i整数型 
局方向逻辑型 
数组文本型0
结果文本型 
最大值文本型 
n整数型 
如果真 (是否为空 (排序方向))
排序方向 = 真

文本_逐字分割_汇编 (整数文本字符串, 数组)
数量 = 取数组成员数 (数组)
判断 (排序方向 = )
计次循环首 (数量, )
最大值 = 数组 [1]
n = 1
计次循环首 (取数组成员数 (数组), i)
如果真 (数组 [i] < 最大值)
最大值 = 数组 [i]
n = i

计次循环尾 ()
删除成员 (数组, n, )
结果 = 结果 + 最大值
计次循环尾 ()



计次循环首 (数量, )
最大值 = 数组 [1]
n = 1
计次循环首 (取数组成员数 (数组), i)
如果真 (数组 [i] > 最大值)
最大值 = 数组 [i]
n = i

计次循环尾 ()
删除成员 (数组, n, )
结果 = 结果 + 最大值
计次循环尾 ()

返回 (结果)

回复

使用道具 举报

结帖率:95% (19/20)

签到天数: 1 天

发表于 2025-2-10 17:59:08 | 显示全部楼层   福建省宁德市
算法艺术家 发表于 2025-2-10 15:41
[e=3].版本 2

.子程序 整数文本排序, 文本型, 公开

将交换=真 改成交换=i
判断循环首判断剩余的交换次数,冒泡次数会大幅度减少
回复

使用道具 举报

结帖率:100% (2/2)

签到天数: 14 天

发表于 2025-2-10 18:29:02 | 显示全部楼层   辽宁省丹东市
大漠小鸟 发表于 2025-2-10 17:59
将交换=真 改成交换=i
判断循环首判断剩余的交换次数,冒泡次数会大幅度减少 ...

感谢大佬
回复

使用道具 举报

签到天数: 4 天

发表于 2025-2-10 19:24:09 | 显示全部楼层   广东省深圳市
  
子程序名返回值类型公开备 注
数字文本排序  
参数名类 型参考可空数组备 注
数字文本文本型参数必须是变量,因为是在原文本上面排的序
置入代码 ({ 139, 117, 8, 139, 54, 137, 240, 141, 80, 3, 139, 56, 131, 192, 4, 141, 143, 255, 254, 254, 254, 247, 215, 33, 249, 129, 225, 128, 128, 128, 128, 116, 233, 247, 193, 128, 128, 0, 0, 117, 6, 193, 233, 16, 131, 192, 2, 208, 225, 25, 208, 137, 194, 137, 247, 49, 201, 86, 65, 57, 209, 116, 29, 137, 211, 41, 203, 49, 255, 71, 57, 223, 119, 15, 138, 6, 58, 70, 1, 118, 5, 134, 70, 1, 136, 6, 70, 235, 236, 94, 235, 221 })

用汇编写了一个,试试!
回复

使用道具 举报

结帖率:100% (2/2)

签到天数: 14 天

发表于 2025-2-10 20:15:25 | 显示全部楼层   辽宁省丹东市
这一个问题 炸出一堆汇编大佬
回复

使用道具 举报

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

本版积分规则 致发广告者

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

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

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