开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 2802|回复: 46
收起左侧

[易语言纯源码] 我和豆包写的排序排序 TimSort

[复制链接]
结帖率:75% (3/4)
发表于 2025-7-13 23:47:46 | 显示全部楼层 |阅读模式   福建省福州市
分享源码
界面截图:
是否带模块: 调用了模块
备注说明: -
https://www.bilibili.com/video/BV1944y1E7as/?vd_source=95702c8745c5d28582eab4405ef02eef
介绍了一个 算法   , 插入和归并混合排序的
f阀值 32. 小于32的成员用插入,然后两两合并起来归并排序
然后我写了主框架。
000.png
让豆包把插入排序,和归并排序的部分,补上
插入排序写的十分完美。然后让它改成更快的二分插入排序   也改出来了  
  
子程序名返回值类型公开备 注
子程序_插入排序3  
参数名类 型参考可空数组备 注
参数_数组整数型
参数_左整数型
参数_右整数型
变量名类 型静态数组备 注
n1整数型 
局变_临时整数型 
m1整数型 
局变_插入点整数型 
如果 (参数_左 ≥ 参数_右)
返回 ()



调试输出 (子程序_输出指定数组成员 (参数_数组, 参数_左, 参数_右))
变量循环首 (参数_左 + 1, 参数_右, 1, n1)
局变_临时 = 参数_数组 [n1]  ' 设置插入值
局变_插入点 = -1  ' 初始化插入点
' 调试输出 (局变_临时, n1)
' 查找插入位置
变量循环首 (n1 - 1, 参数_左, -1, m1)
如果 (参数_数组 [m1] > 局变_临时)
参数_数组 [m1 + 1] = 参数_数组 [m1]  ' 元素后移
局变_插入点 = m1 + 1  ' 找到插入点
跳出循环 ()

变量循环尾 ()
' 处理最小元素的情况
如果 (局变_插入点 = -1)
局变_插入点 = 参数_左



参数_数组 [局变_插入点] = 局变_临时  ' 插入元素
' 调试输出 (子程序_输出指定数组成员 (参数_数组, 参数_左, 参数_右))
变量循环尾 ()
调试输出 (子程序_输出指定数组成员 (参数_数组, 参数_左, 参数_右))


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

  
子程序名返回值类型公开备 注
子程序_二分插入排序3  
参数名类 型参考可空数组备 注
参数_数组整数型
参数_左整数型
参数_右整数型
变量名类 型静态数组备 注
n1整数型 
局变_临时整数型 
局变_左整数型 
局变_右整数型 
局变_中间整数型 
m1整数型 
' 边界检查:无需排序的情况
如果 (参数_左 ≥ 参数_右)
返回 ()



' 从第二个元素开始插入排序
变量循环首 (参数_左 + 1, 参数_右, 1, n1)
局变_临时 = 参数_数组 [n1]  ' 保存当前插入值
局变_左 = 参数_左  ' 二分查找左边界
局变_右 = n1 - 1  ' 二分查找右边界
' 二分查找插入位置
判断循环首 (局变_左 ≤ 局变_右)
局变_中间 = 局变_左 (局变_右 - 局变_左) ÷ 2  ' 避免溢出
如果 (参数_数组 [局变_中间] > 局变_临时)
局变_右 = 局变_中间 - 1  ' 目标在左半部分
局变_左 = 局变_中间 + 1  ' 目标在右半部分

判断循环尾 ()
' 元素后移(从插入位置到当前位置)
变量循环首 (n1 - 1, 局变_左, -1, m1)
参数_数组 [m1 + 1] = 参数_数组 [m1]
变量循环尾 ()
' 插入元素
参数_数组 [局变_左] = 局变_临时
变量循环尾 ()

豆包可以啊,插入排序的改版也能轻松实现  我想半天
直接输入残缺代码  他就补上了
111.png 222.png 333.png

444.png

它搞不清循环判断 和判断循环。有时候忘记循环判断尾()里加 真
555.png 666.png 777.png


然后让他补上  归并排序的代码。也整挺好,除了一点拷贝到IDE的错乱外,也能跑了
提示修改一些bug后,连主框架都改成看不懂的样子‘但是结果是没问题的
888.png

本来非常费脑子的事情   AI给解决了
用是没问题的,就是要理解代码和修改BUG就很难了

然后看看完整代码   

  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
程变_临时整数型0用于归并排序的临时数组

子程序名返回值类型公开备 注
__启动窗口_创建完毕  
变量名类 型静态数组备 注
aaa整数型0
bbb整数型0
' 调试模块_创建整数型数组_无重复 (aaa, 10000000)
调试模块_创建整数型数组_有重复 (aaa, 10000000, 1, 100000)
bbb = aaa
' aaa = { 94, 29, 43, 16, 65, 80, 31, 33, 88, 92, 41, 61, 34, 52, 44, 19, 56, 4, 18, 90, 57, 38, 2, 28, 48, 32, 89, 81, 36, 69, 14, 85, 62, 24, 54, 84, 96, 9, 3, 63, 76, 82, 58, 73, 20, 93, 1, 55, 98, 67, 40, 22, 97, 51, 27, 17, 79, 77, 71, 10, 45, 74, 8, 47, 25, 12, 6, 35, 75, 83, 23, 87, 100, 60, 13, 30, 37, 78, 68, 95, 91, 53, 99, 21, 5, 26, 49, 72, 70, 50, 59, 86, 42, 46, 64, 39, 66, 11, 15, 7 }
' 调试输出 (aaa)
计时器启动 ()
子程序_新排序 (aaa)
计时器结束 ()
计时器启动 ()
排序模块_归并排序 (bbb)
计时器结束 ()
' 调试输出 (aaa)
调试输出 (调试模块_检查数组是否排序过 (aaa, ))
调试输出 (调试模块_检查数组是否排序过 (bbb, ))
结束 ()
' 全局临时数组,避免重复创建
' 全局临时数组,避免重复创建
' 全局临时数组,用于归并排序
' 全局临时数组,用于归并排序
' 全局临时数组(归并排序专用,解决跨子程序访问问题)
子程序名返回值类型公开备 注
子程序_新排序  
参数名类 型参考可空数组备 注
参数_数组整数型
变量名类 型静态数组备 注
局变_阀值整数型默认32
局变_数组个数整数型 
局变_间隔整数型 
局变_左整数型 
局变_右整数型 
局变_游标x首整数型 
局变_游标x尾整数型 
局变_游标y首整数型 
局变_游标y尾整数型 
' 初始化参数
局变_阀值 = 32
局变_数组个数 = 取数组成员数 (参数_数组)
' 空数组或单元素数组无需排序
如果 (局变_数组个数 ≤ 1)
返回 ()



' 小数组直接用二分插入排序
如果 (局变_数组个数 < 局变_阀值)
子程序_二分插入排序3 (参数_数组, 1, 局变_数组个数)
返回 ()



' 初始化临时数组(大小与原数组一致)
重定义数组 (程变_临时, 假, 局变_数组个数)
' 第一阶段:按阀值分割数组并排序每个子段
局变_左 = 1
局变_间隔 = 局变_阀值
循环判断首 ()
' 计算右边界并修正(防止越界)
局变_右 = 局变_左 + 局变_间隔 - 1
如果 (局变_右 > 局变_数组个数)
局变_右 = 局变_数组个数



' 确保左边界≤右边界(避免无效排序)
如果 (局变_左 > 局变_右)
跳出循环 ()



' 排序当前子段
子程序_二分插入排序3 (参数_数组, 局变_左, 局变_右)
' 移动到下一个子段
局变_左 = 局变_右 + 1
' 所有子段处理完毕,退出循环
如果 (局变_左 > 局变_数组个数)
跳出循环 ()



循环判断尾 ()
' 第二阶段:归并排序(逐步合并子数组)
局变_间隔 = 局变_阀值
循环判断首 ()
局变_游标x首 = 1  ' 每次从数组头部开始归并
' 归并当前间隔下的所有相邻子数组
循环判断首 ()
' 计算左子数组边界并修正
局变_游标x尾 = 局变_游标x首 + 局变_间隔 - 1
如果 (局变_游标x尾 > 局变_数组个数)
局变_游标x尾 = 局变_数组个数



' 计算右子数组起始位置
局变_游标y首 = 局变_游标x尾 + 1
' 右子数组不存在(已到数组末尾),退出当前间隔的归并
如果 (局变_游标y首 > 局变_数组个数)
跳出循环 ()



' 计算右子数组边界并修正
局变_游标y尾 = 局变_游标y首 + 局变_间隔 - 1
如果 (局变_游标y尾 > 局变_数组个数)
局变_游标y尾 = 局变_数组个数



' 归并两个相邻子数组
子程序_归并排序_正常 (参数_数组, 局变_游标x首, 局变_游标x尾, 局变_游标y首, 局变_游标y尾)
' 移动到下一组子数组
局变_游标x首 = 局变_游标y尾 + 1
' 所有组处理完毕,退出当前间隔的归并
如果 (局变_游标x首 > 局变_数组个数)
跳出循环 ()



循环判断尾 ()
' 间隔翻倍(归并更大的子数组)
局变_间隔 = 局变_间隔 × 2
' 间隔超过数组长度,排序完成
如果 (局变_间隔 > 局变_数组个数)
跳出循环 ()



循环判断尾 ()
子程序名返回值类型公开备 注
子程序_二分插入排序3  
参数名类 型参考可空数组备 注
参数_数组整数型
参数_左整数型
参数_右整数型
变量名类 型静态数组备 注
n1整数型 
局变_临时整数型 
局变_左整数型 
局变_右整数型 
局变_中间整数型 
m1整数型 
' 边界检查:无需排序的情况
如果 (参数_左 ≥ 参数_右)
返回 ()



' 从第二个元素开始插入排序
变量循环首 (参数_左 + 1, 参数_右, 1, n1)
局变_临时 = 参数_数组 [n1]  ' 保存当前插入值
局变_左 = 参数_左  ' 二分查找左边界
局变_右 = n1 - 1  ' 二分查找右边界
' 二分查找插入位置
判断循环首 (局变_左 ≤ 局变_右)
局变_中间 = 局变_左 (局变_右 - 局变_左) ÷ 2  ' 避免溢出
如果 (参数_数组 [局变_中间] > 局变_临时)
局变_右 = 局变_中间 - 1  ' 目标在左半部分
局变_左 = 局变_中间 + 1  ' 目标在右半部分

判断循环尾 ()
' 元素后移(从插入位置到当前位置)
变量循环首 (n1 - 1, 局变_左, -1, m1)
参数_数组 [m1 + 1] = 参数_数组 [m1]
变量循环尾 ()
' 插入元素
参数_数组 [局变_左] = 局变_临时
变量循环尾 ()
子程序名返回值类型公开备 注
子程序_归并排序_正常  
参数名类 型参考可空数组备 注
参数_数组整数型
参数_游标x首整数型
参数_游标x尾整数型
参数_游标y首整数型
参数_游标y尾整数型
变量名类 型静态数组备 注
局变_i整数型' 左子数组游标
局变_j整数型 ' 右子数组游标
局变_k整数型' 结果数组游标
' 边界检查:无效参数直接返回
如果 (参数_游标x首 > 参数_游标x尾 参数_游标y首 > 参数_游标y尾)
返回 ()



' 将待归并的元素复制到临时数组
变量循环首 (参数_游标x首, 参数_游标y尾, 1, 局变_i)
程变_临时 [局变_i] = 参数_数组 [局变_i]
变量循环尾 ()
' 初始化游标
局变_i = 参数_游标x首
局变_j = 参数_游标y首
局变_k = 参数_游标x首
' 归并两个有序子数组
循环判断首 ()
' 左子数组已处理完,复制右子数组剩余元素
如果 (局变_i > 参数_游标x尾)
变量循环首 (局变_j, 参数_游标y尾, 1, 局变_j)
参数_数组 [局变_k] = 程变_临时 [局变_j]
局变_k = 局变_k + 1
变量循环尾 ()
跳出循环 ()



' 右子数组已处理完,复制左子数组剩余元素
如果 (局变_j > 参数_游标y尾)
变量循环首 (局变_i, 参数_游标x尾, 1, 局变_i)
参数_数组 [局变_k] = 程变_临时 [局变_i]
局变_k = 局变_k + 1
变量循环尾 ()
跳出循环 ()



' 比较并取较小元素
如果 (程变_临时 [局变_i] ≤ 程变_临时 [局变_j])
参数_数组 [局变_k] = 程变_临时 [局变_i]
局变_i = 局变_i + 1
参数_数组 [局变_k] = 程变_临时 [局变_j]
局变_j = 局变_j + 1
局变_k = 局变_k + 1
循环判断尾 ()


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



新建文件夹 2.zip

299.28 KB, 下载次数: 10, 下载积分: 精币 -2 枚

评分

参与人数 18好评 +2 精币 +18 收起 理由
失落的情域 + 1 + 2 支持开源~!感谢分享
jc520hll + 1 感谢分享,很给力!~
cbl521ysys + 1 感谢分享,很给力!~
无尘666 + 1 感谢分享,很给力!~
huangdi9569 + 1 感谢分享,很给力!~
pj小黑屋 + 1 感谢分享,很给力!~
文西哥 + 1 感谢分享,很给力!~
望尘莫及 + 1 感谢分享,很给力!~
暮光之城 + 1 感谢分享,很给力!~
初阳123 + 1 感谢分享,很给力!~
风雨3137 + 1 感谢分享,很给力!~
浮梦 + 1 感谢分享,很给力!~
Zźh926 + 1 感谢分享,很给力!~
huangdi956 + 1 感谢分享,很给力!~
YunXiGe + 1 感谢分享,很给力!~
洛哥 + 1 感谢分享,很给力!~
kyo9766 + 1 感谢分享,很给力!~
多多帅吧 + 1 大神,请收下我的膝盖

查看全部评分


本帖被以下淘专辑推荐:

结帖率:33% (1/3)

签到天数: 14 天

发表于 2025-10-8 09:18:17 | 显示全部楼层   广东省茂名市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:60% (3/5)
发表于 2025-7-20 09:54:00 | 显示全部楼层   山西省太原市
膜拜大神!感谢超干货的分享~
回复 支持 反对

使用道具 举报

签到天数: 22 天

发表于 2025-7-20 09:38:16 | 显示全部楼层   浙江省宁波市
感谢分享,支持开源!!!
回复 支持 反对

使用道具 举报

结帖率:75% (3/4)

签到天数: 12 天

 楼主| 发表于 2025-7-19 23:08:58 | 显示全部楼层   福建省福州市
03 是 豆包给出的一个易语言版本蒂姆排序
解决了几十个报错 可用了,速度不太快,阀值啥的也一头雾水

04 是根据豆包给出的一个简洁的py代码翻译的
到07 都是这个版本的优化。07的时候,已经优化到 和排序模块  归并差不多 的速度了

  
def tim_sort (arr):
min_run = 32
n = len (arr)

# 阶段1:将数组分成多个运行 (run)
for start in range (0, n, min_run):
end = min (start + min_run - 1, n - 1)
insertion_sort (arr, start, end)

# 阶段2:合并相邻的运行
size = min_run
while size < n:
for left in range (0, n, 2 * size):
mid = min (left + size - 1, n - 1)
right = min (left + 2 * size - 1, n - 1)

if mid < right:
merge (arr, left, mid, right)

size *= 2

return arr
def insertion_sort (arr, left, right):
for i in range (left + 1, right + 1):
key_item = arr[i]
j = i - 1

while j >= left and arr[j] > key_item:
arr[j + 1] = arr[j]
j -= 1

arr[j + 1] = key_item

return arr
def merge (arr, left, mid, right):
# 如果两个部分已经有序,则直接返回
if arr[mid] <= arr[mid + 1]:
return

# 创建左右部分的临时数组
left_part = arr[left:mid + 1]
right_part = arr[mid + 1:right + 1]

i = j = 0
k = left

# 合并临时数组回原数组
while i < len (left_part) and j < len (right_part):
if left_part[i] <= right_part[j]:
arr[k] = left_part[i]
i += 1
else:
arr[k] = right_part[j]
j += 1
k += 1

# 复制剩余元素
arr[k:k + len (left_part) - i] = left_part[i:]
return arr
# 示例用法
if __name__ == "__main__":
arr = [5, 2, 1, 3, 8, 6, 7, 4]
sorted_arr = tim_sort (arr)
print ("排序结果:", sorted_arr)

  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
临时左数组整数型0 
临时右数组整数型0 

子程序名返回值类型公开备 注
__启动窗口_创建完毕  
变量名类 型静态数组备 注
aaa整数型0
bbb整数型0
' 调试模块_创建整数型数组_无重复 (aaa, 1000000)
调试模块_创建整数型数组_有重复 (aaa, 1000000, 1, 10000)
bbb = aaa
计时器启动 ()
蒂姆排序 (aaa, 取数组成员数 (aaa))
计时器结束 ()
计时器启动 ()
排序模块_归并排序 (bbb)
' 排序模块_简单的快排 (bbb, 1, 取数组成员数 (bbb))
计时器结束 ()
调试输出 (“排序结果:”, 调试模块_检查数组是否排序过 (aaa, ))
鸣叫 ()
鸣叫 ()
结束 ()
' 全局临时数组,避免重复创建和销毁
' 主要优化点:
' 全局临时数组:
' 添加了两个全局数组变量 临时左数组 和 临时右数组
' 这些数组在程序运行期间只会创建一次,避免了重复分配内存
' 动态调整数组大小:
' 在使用前检查数组大小,只有当现有数组不足以容纳数据时才调整大小
' 使用 取数组成员数() 函数获取当前数组长度
' 减少内存操作:
' 大多数情况下不需要重新分配内存,只需覆盖原有数据
' 只有当合并块大小增长时才需要调整数组大小
' 这种优化对于大规模数据排序尤为有效,因为它显著减少了内存分配和垃圾回收的开销。在实际测试中,这种改进通常能使排序速度提高 10-20%,特别是在处理大量数据时。
' 注意事项:
' 全局数组会在程序整个生命周期内占用内存
' 如果你的程序需要同时处理多个排序任务,可能需要考虑线程安全问题
' 在排序非常小的数组时,这种优化的效果可能不明显
子程序名返回值类型公开备 注
蒂姆排序整数型 
参数名类 型参考可空数组备 注
待排序数组整数型
数组长度整数型
变量名类 型静态数组备 注
最小运行长度整数型 
起始位置整数型 
结束位置整数型 
合并块大小整数型 
左边界整数型 
中间位置整数型 
右边界整数型 
最小运行长度 = 32  ' 可调整为更小值以减少插入排序开销
' 第一阶段:将数组分割为多个有序运行(run)
起始位置 = 1
循环判断首 ()
如果 (起始位置 > 数组长度)
跳出循环 ()



结束位置 = 起始位置 + 最小运行长度 - 1
如果 (结束位置 > 数组长度)
结束位置 = 数组长度



' 使用二分插入排序优化短片段
二分插入排序 (待排序数组, 起始位置, 结束位置)
起始位置 = 起始位置 + 最小运行长度
循环判断尾 ()
' 第二阶段:合并相邻的有序运行
合并块大小 = 最小运行长度
循环判断首 ()
如果 (合并块大小 > 数组长度)
跳出循环 ()



左边界 = 1
循环判断首 ()
如果 (左边界 > 数组长度)
跳出循环 ()



中间位置 = 左边界 + 合并块大小 - 1
如果 (中间位置 > 数组长度)
中间位置 = 数组长度



右边界 = 左边界 + 2 × 合并块大小 - 1
如果 (右边界 > 数组长度)
右边界 = 数组长度



' 如果存在两个相邻块且未有序,则合并它们
如果 (中间位置 < 右边界 待排序数组 [中间位置] > 待排序数组 [中间位置 + 1])
优化合并有序块 (待排序数组, 左边界, 中间位置, 右边界)



左边界 = 左边界 + 2 × 合并块大小
循环判断尾 ()
合并块大小 = 合并块大小 × 2
循环判断尾 ()
返回 (0)
子程序名返回值类型公开备 注
二分插入排序整数型 
参数名类 型参考可空数组备 注
待排序数组整数型
左边界整数型
右边界整数型
变量名类 型静态数组备 注
当前位置整数型 
当前元素整数型 
插入位置整数型 
低边界整数型 
高边界整数型 
中间点整数型 
i整数型 
当前位置 = 左边界 + 1
循环判断首 ()
如果 (当前位置 > 右边界)
跳出循环 ()



当前元素 = 待排序数组 [当前位置]
' 二分查找插入位置
低边界 = 左边界
高边界 = 当前位置 - 1
循环判断首 ()
如果 (低边界 > 高边界)
跳出循环 ()



中间点 (低边界 + 高边界) ÷ 2
如果 (待排序数组 [中间点] > 当前元素)
高边界 = 中间点 - 1
低边界 = 中间点 + 1

循环判断尾 ()
插入位置 = 低边界
' 移动元素腾出空间
i = 当前位置 - 1
循环判断首 ()
如果 (i < 插入位置)
跳出循环 ()



待排序数组 [i + 1] = 待排序数组 [i]
i = i - 1
循环判断尾 ()
待排序数组 [插入位置] = 当前元素
当前位置 = 当前位置 + 1
循环判断尾 ()
返回 (0)
子程序名返回值类型公开备 注
优化合并有序块整数型 
参数名类 型参考可空数组备 注
待排序数组整数型
左边界整数型
中间位置整数型
右边界整数型
变量名类 型静态数组备 注
左半索引整数型 
右半索引整数型 
目标索引整数型 
左半长度整数型 
右半长度整数型 
' 创建左右两部分的临时数组
左半长度 = 中间位置 - 左边界 + 1
右半长度 = 右边界 - 中间位置
' 仅分配较小的临时数组(优化内存使用)
如果 (左半长度 < 右半长度)
' 调整全局临时数组大小
如果 (取数组成员数 (临时左数组) < 左半长度)
重定义数组 (临时左数组, 假, 左半长度)



' 复制左半部分到临时数组
左半索引 = 1
循环判断首 ()
如果 (左半索引 > 左半长度)
跳出循环 ()



临时左数组 [左半索引] = 待排序数组 [左边界 + 左半索引 - 1]
左半索引 = 左半索引 + 1
循环判断尾 ()
' 合并到原数组
左半索引 = 1
右半索引 = 中间位置 + 1
目标索引 = 左边界
循环判断首 ()
如果 (左半索引 > 左半长度 右半索引 > 右边界)
跳出循环 ()



如果 (临时左数组 [左半索引] ≤ 待排序数组 [右半索引])
待排序数组 [目标索引] = 临时左数组 [左半索引]
左半索引 = 左半索引 + 1
待排序数组 [目标索引] = 待排序数组 [右半索引]
右半索引 = 右半索引 + 1

目标索引 = 目标索引 + 1
循环判断尾 ()
' 复制左半部分剩余元素
循环判断首 ()
如果 (左半索引 > 左半长度)
跳出循环 ()



待排序数组 [目标索引] = 临时左数组 [左半索引]
左半索引 = 左半索引 + 1
目标索引 = 目标索引 + 1
循环判断尾 ()
' 调整全局临时数组大小
如果 (取数组成员数 (临时右数组) < 右半长度)
重定义数组 (临时右数组, 假, 右半长度)



' 复制右半部分到临时数组
右半索引 = 1
循环判断首 ()
如果 (右半索引 > 右半长度)
跳出循环 ()



临时右数组 [右半索引] = 待排序数组 [中间位置 + 右半索引]
右半索引 = 右半索引 + 1
循环判断尾 ()
' 合并到原数组(从右向左)
左半索引 = 中间位置
右半索引 = 右半长度
目标索引 = 右边界
循环判断首 ()
如果 (左半索引 < 左边界 右半索引 < 1)
跳出循环 ()



如果 (待排序数组 [左半索引] ≥ 临时右数组 [右半索引])
待排序数组 [目标索引] = 待排序数组 [左半索引]
左半索引 = 左半索引 - 1
待排序数组 [目标索引] = 临时右数组 [右半索引]
右半索引 = 右半索引 - 1

目标索引 = 目标索引 - 1
循环判断尾 ()
' 复制右半部分剩余元素
循环判断首 ()
如果 (右半索引 < 1)
跳出循环 ()



待排序数组 [目标索引] = 临时右数组 [右半索引]
右半索引 = 右半索引 - 1
目标索引 = 目标索引 - 1
循环判断尾 ()

返回 (0)


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

新 蒂姆排序 - 副本.zip

111.17 KB, 下载次数: 0, 下载积分: 精币 -2 枚

回复 支持 反对

使用道具 举报

结帖率:75% (3/4)

签到天数: 12 天

 楼主| 发表于 2025-7-19 14:40:00 | 显示全部楼层   福建省福州市
本帖最后由 APPLEUFO 于 2025-7-19 14:44 编辑

前面打包rar的时候,漏了一楼贴出的代码,既可以拷贝一楼的代码  也可以下载这个

这段代码实现了一个结合二分插入排序和归并排序的混合排序算法。我将为你解释这个算法的工作原理和代码结构。
算法原理
这个排序算法结合了两种排序方法的优势:
二分插入排序:对于小规模数据(小于阀值 32),使用二分插入排序效率较高。它通过二分查找确定插入位置,减少比较次数。
归并排序:对于大规模数据,使用归并排序保证稳定的 O (n log n) 时间复杂度。归并排序采用分治策略,将数组分成较小的子数组,直到每个子数组都有序,然后合并这些子数组。
代码结构
代码包含三个主要子程序:
子程序_新排序:主排序子程序,协调整个排序过程:
处理空数组或单元素数组
对小规模数组直接使用二分插入排序
对大规模数组:
首先将数组分割成多个子数组,每个子数组使用二分插入排序
然后逐步合并这些子数组,直到整个数组有序
子程序_二分插入排序 3:实现二分插入排序:
遍历数组,对每个元素使用二分查找确定其在已排序部分的插入位置
将插入位置之后的元素后移,插入当前元素
子程序_归并排序_正常:实现两个有序子数组的归并:
将待归并的元素复制到临时数组
比较两个子数组的元素,按顺序合并回原数组
算法特点
混合策略:结合插入排序和归并排序,充分利用插入排序在小规模数据上的优势
稳定性:归并排序是稳定的,保持相等元素的相对顺序
时间复杂度:整体为 O (n log n),适合大规模数据排序
这个算法的实现遵循了分治策略,通过预排序小规模子数组和逐步合并的方式,有效减少了比较和交换的次数,提高了排序效率。


新排序7 这才是可以的 .e

81.99 KB, 下载次数: 0, 下载积分: 精币 -2 枚

回复 支持 反对

使用道具 举报

签到天数: 22 天

发表于 2025-7-19 09:37:50 | 显示全部楼层   浙江省宁波市
感谢分享,支持开源!!!
回复 支持 反对

使用道具 举报

签到天数: 22 天

发表于 2025-7-18 09:37:46 | 显示全部楼层   浙江省宁波市
感谢分享,支持开源!!!
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)
发表于 2025-7-18 04:05:22 | 显示全部楼层   陕西省西安市
666666666666666666666666666666666666666666
回复 支持 反对

使用道具 举报

签到天数: 17 天

发表于 2025-7-17 12:28:39 | 显示全部楼层   北京市北京市
11111111111111111111111111
回复 支持 反对

使用道具 举报

签到天数: 22 天

发表于 2025-7-17 09:36:30 | 显示全部楼层   浙江省宁波市
感谢分享,支持开源!!!
回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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