开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

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

[易源码分享] 和龙虾写的排序 Tim 排序

[复制链接]
结帖率:75% (3/4)
发表于 2026-4-14 16:59:14 | 显示全部楼层 |阅读模式   福建省福州市
分享源码
界面截图:
是否带模块: 调用了模块
备注说明: -
本帖最后由 APPLEUFO 于 2026-4-15 08:47 编辑

http://oi-wiki.com/basic/tim-sort/
Tim 排序
[color=rgba(0, 0, 0, 0.87)]本页面将介绍 Tim 排序(Timsort),一种混合的、稳定的排序算法.
引入
[color=rgba(0, 0, 0, 0.87)]Timsort 由 Python 核心开发者 Tim Peters 于 2002 年设计,并应用于 Python 语言,其巧妙结合了插入排序和归并排序的优点,针对数据集中的有序性进行了精确的优化,尤其适合处理包含大量部分有序子序列的数据集.自 Python 2.3 版本以来,Timsort 被选为 Python 标准库的默认排序算法,并被广泛应用于其他编程环境,例如在 Java SE 7 中被用于对非原始对象数组进行排序.

[color=rgba(0, 0, 0, 0.87)]和龙虾调试半天弄出来 经过测试  
[color=rgba(0, 0, 0, 0.87)]易语言里面  倒是对比普通 的   递归归并,迭代归并排序没啥优势    而且代码太复杂
[color=rgba(0, 0, 0, 0.87)]压缩包里带了龙虾写的快排的递归版,和迭代版

WorkBuddy
太好了!Tim Sort 终于跑通了!

这个可靠版的核心结构很清晰:

计算最小Run - 用位运算找到合适的Run大小(32-64之间)
构建Runs - 识别自然有序序列,不足的用插入排序扩展
自底向上归并 - 按宽度倍增的方式逐层归并
你现在的代码已经完整实现了标准Tim Sort的三阶段流程:

自然Run识别(还能检测降序并反转)
插入排序扩展短Run
标准归并


  
窗口程序集名保 留  保 留备 注
程序集3   
子程序名返回值类型公开备 注
排序_Tim排序_可靠版 从小到大
参数名类 型参考可空数组备 注
参数_数组整数型
变量名类 型静态数组备 注
局变_数组长度整数型 
局变_最小Run整数型 
局变_临时数组整数型0
局变_数组长度 = 取数组成员数 (参数_数组)
如果 (局变_数组长度 < 2)
返回 ()



' 分配临时数组用于归并
重定义数组 (局变_临时数组, 假, 局变_数组长度)
局变_最小Run = 计算最小Run (局变_数组长度)
' 第一阶段:构建有序Run(自然Run识别 + 插入排序扩展)
Tim排序_构建Runs (参数_数组, 局变_数组长度, 局变_最小Run)
' 第二阶段:标准自底向上归并
Tim排序_自底向上归并 (参数_数组, 局变_临时数组, 局变_数组长度, 局变_最小Run)
子程序名返回值类型公开备 注
计算最小Run整数型 
参数名类 型参考可空数组备 注
参数_数组长度整数型
变量名类 型静态数组备 注
局变_R整数型 
局变_R = 0
判断循环首 (参数_数组长度 ≥ 64)
局变_R = 位或 (局变_R, 位与 (参数_数组长度, 1))
参数_数组长度 = 右移 (参数_数组长度, 1)
判断循环尾 ()
返回 (参数_数组长度 + 局变_R)
子程序名返回值类型公开备 注
识别自然Run整数型 
参数名类 型参考可空数组备 注
参数_数组整数型
参数_起始位置整数型
参数_剩余长度整数型
变量名类 型静态数组备 注
局变_当前位置整数型 
局变_是升序逻辑型 
如果 (参数_剩余长度 = 1)
返回 (1)



局变_当前位置 = 参数_起始位置 + 1
' 判断升序还是降序
如果 (参数_数组 [局变_当前位置] ≥ 参数_数组 [局变_当前位置 - 1])
局变_是升序 = 真
' 升序扩展
判断循环首 (局变_当前位置 < 参数_起始位置 + 参数_剩余长度)
如果 (参数_数组 [局变_当前位置] < 参数_数组 [局变_当前位置 - 1])
跳出循环 ()


局变_当前位置 = 局变_当前位置 + 1
判断循环尾 ()
局变_是升序 = 假
' 降序扩展
判断循环首 (局变_当前位置 < 参数_起始位置 + 参数_剩余长度)
如果 (参数_数组 [局变_当前位置] > 参数_数组 [局变_当前位置 - 1])
跳出循环 ()


局变_当前位置 = 局变_当前位置 + 1
判断循环尾 ()
' 反转降序Run
Tim排序_反转 (参数_数组, 参数_起始位置, 局变_当前位置 - 1)

返回 (局变_当前位置 - 参数_起始位置)
子程序名返回值类型公开备 注
Tim排序_反转  
参数名类 型参考可空数组备 注
参数_数组整数型
参数_左边界整数型
参数_右边界整数型
判断循环首 (参数_左边界 < 参数_右边界)
交换变量 (参数_数组 [参数_左边界], 参数_数组 [参数_右边界])
参数_左边界 = 参数_左边界 + 1
参数_右边界 = 参数_右边界 - 1
判断循环尾 ()
子程序名返回值类型公开备 注
Tim排序_构建Runs  
参数名类 型参考可空数组备 注
参数_数组整数型
参数_数组长度整数型
参数_最小Run整数型
变量名类 型静态数组备 注
局变_起始位置整数型 
局变_剩余长度整数型 
局变_Run长度整数型 
局变_扩展长度整数型 
局变_起始位置 = 1
局变_剩余长度 = 参数_数组长度
判断循环首 (局变_剩余长度 > 0)
局变_Run长度 = 识别自然Run (参数_数组, 局变_起始位置, 局变_剩余长度)
' 扩展Run
如果 (局变_Run长度 < 参数_最小Run)
局变_扩展长度 = 参数_最小Run
如果 (局变_扩展长度 > 局变_剩余长度)
局变_扩展长度 = 局变_剩余长度



' 用插入排序扩展 [起始位置+Run长度, 起始位置+扩展长度-1]
插入排序扩展 (参数_数组, 局变_起始位置, 局变_起始位置 + 局变_Run长度 - 1, 局变_起始位置 + 局变_扩展长度 - 1)
局变_Run长度 = 局变_扩展长度



局变_起始位置 = 局变_起始位置 + 局变_Run长度
局变_剩余长度 = 局变_剩余长度 - 局变_Run长度
判断循环尾 ()
子程序名返回值类型公开备 注
插入排序扩展  
参数名类 型参考可空数组备 注
参数_数组整数型
参数_Run起始整数型
参数_Run结束整数型
参数_扩展结束整数型
变量名类 型静态数组备 注
局变_i整数型 
局变_j整数型 
局变_当前值整数型 
' 将 [Run结束+1, 扩展结束] 的元素插入到 [Run起始, Run结束]
计次循环首 (参数_扩展结束 - 参数_Run结束, 局变_i)
局变_当前值 = 参数_数组 [参数_Run结束 + 局变_i]
局变_j = 参数_Run结束 + 局变_i - 1
' 在已排序部分找插入位置
判断循环首 (局变_j ≥ 参数_Run起始 参数_数组 [局变_j] > 局变_当前值)
参数_数组 [局变_j + 1] = 参数_数组 [局变_j]
局变_j = 局变_j - 1
判断循环尾 ()
参数_数组 [局变_j + 1] = 局变_当前值
计次循环尾 ()
子程序名返回值类型公开备 注
Tim排序_自底向上归并  
参数名类 型参考可空数组备 注
参数_数组整数型
参数_临时数组整数型
参数_数组长度整数型
参数_最小Run整数型
变量名类 型静态数组备 注
局变_宽度整数型 
局变_i整数型 
局变_左起始整数型 
局变_中间位置整数型 
局变_右结束整数型 
局变_宽度 = 参数_最小Run
判断循环首 (局变_宽度 < 参数_数组长度)
局变_i = 1
判断循环首 (局变_i ≤ 参数_数组长度)
局变_左起始 = 局变_i
局变_中间位置 = 局变_i + 局变_宽度 - 1
如果 (局变_中间位置 ≥ 参数_数组长度)
跳出循环 ()



局变_右结束 = 局变_i + 局变_宽度 × 2 - 1
如果 (局变_右结束 > 参数_数组长度)
局变_右结束 = 参数_数组长度



' 归并 [左起始, 中间位置][中间位置+1, 右结束]
标准归并 (参数_数组, 参数_临时数组, 局变_左起始, 局变_中间位置, 局变_右结束)
局变_i = 局变_i + 局变_宽度 × 2
判断循环尾 ()
局变_宽度 = 局变_宽度 × 2
判断循环尾 ()
子程序名返回值类型公开备 注
标准归并  
参数名类 型参考可空数组备 注
参数_数组整数型
参数_临时数组整数型
参数_左边界整数型
参数_中间位置整数型
参数_右边界整数型
变量名类 型静态数组备 注
局变_i整数型 
局变_j整数型 
局变_k整数型 
' 复制到临时数组
计次循环首 (参数_中间位置 - 参数_左边界 + 1, 局变_i)
参数_临时数组 [参数_左边界 + 局变_i - 1] = 参数_数组 [参数_左边界 + 局变_i - 1]
计次循环尾 ()
计次循环首 (参数_右边界 - 参数_中间位置, 局变_i)
参数_临时数组 [参数_中间位置 + 局变_i] = 参数_数组 [参数_中间位置 + 局变_i]
计次循环尾 ()
' 归并
局变_i = 参数_左边界
局变_j = 参数_中间位置 + 1
局变_k = 参数_左边界
判断循环首 (局变_i ≤ 参数_中间位置 局变_j ≤ 参数_右边界)
如果 (参数_临时数组 [局变_i] ≤ 参数_临时数组 [局变_j])
参数_数组 [局变_k] = 参数_临时数组 [局变_i]
局变_i = 局变_i + 1
参数_数组 [局变_k] = 参数_临时数组 [局变_j]
局变_j = 局变_j + 1
局变_k = 局变_k + 1
判断循环尾 ()
' 复制剩余
计次循环首 (参数_中间位置 - 局变_i + 1, )
参数_数组 [局变_k] = 参数_临时数组 [局变_i]
局变_i = 局变_i + 1
局变_k = 局变_k + 1
计次循环尾 ()
计次循环首 (参数_右边界 - 局变_j + 1, )
参数_数组 [局变_k] = 参数_临时数组 [局变_j]
局变_j = 局变_j + 1
局变_k = 局变_k + 1
计次循环尾 ()

排序_Tim排序_可靠版.rar

164.01 KB, 下载次数: 13, 下载积分: 精币 -2 枚

4E861B84C8FFB0D9021575A6889DCA2D.png
1.png
QQ20260414-165537.png

评分

参与人数 1精币 +1 收起 理由
kyo9766 + 1 感谢分享,很给力!~

查看全部评分


结帖率:0% (0/2)

签到天数: 28 天

发表于 2026-4-15 15:44:01 | 显示全部楼层   广西壮族自治区玉林市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)

签到天数: 22 天

发表于 2026-4-15 09:41:45 | 显示全部楼层   河北省秦皇岛市
看着好像很牛逼的样子,学习了
回复 支持 反对

使用道具 举报

结帖率:100% (3/3)

签到天数: 24 天

发表于 2026-4-15 09:18:48 | 显示全部楼层   山东省青岛市
看看速度怎么样,感谢分享
回复 支持 反对

使用道具 举报

结帖率:100% (4/4)

签到天数: 29 天

发表于 2026-4-15 08:03:51 | 显示全部楼层   山东省淄博市
感谢分享
回复 支持 反对

使用道具 举报

签到天数: 30 天

发表于 2026-4-14 23:16:20 | 显示全部楼层   山东省青岛市
龙虾写的?这Tim排序怕不是海鲜味儿的吧,哈哈,链接先收藏了,回头细品!
回复 支持 反对

使用道具 举报

结帖率:100% (17/17)

签到天数: 26 天

发表于 2026-4-14 21:31:56 | 显示全部楼层   江苏省常州市
搜索看看干嘛用的
回复 支持 反对

使用道具 举报

签到天数: 24 天

发表于 2026-4-14 18:05:14 | 显示全部楼层   河北省邯郸市
66666666666666666
回复 支持 反对

使用道具 举报

结帖率:50% (1/2)

签到天数: 19 天

发表于 2026-4-14 17:56:28 | 显示全部楼层   广东省汕头市
感谢大神分享~!
回复 支持 反对

使用道具 举报

签到天数: 28 天

发表于 2026-4-14 17:35:17 | 显示全部楼层   新疆维吾尔自治区巴音郭楞蒙古自治州
谢谢分享
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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