希尔排序是插入法排序的更高效的改进版本,也称递减增量排序算法,但希尔排序是非稳定排序算法。
改进思路
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;
算法思想
希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
算法步骤
选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;
按增量序列个数 k,对序列进行 k 趟排序;
每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
希尔排序模块
.版本 2
.子程序 希尔排序
.参数 参数组, 整数型, 数组
.局部变量 数量, 整数型
.局部变量 临时, 整数型
.局部变量 i, 整数型
.局部变量 j, 整数型
.局部变量 pos, 整数型
.局部变量 tmp, 整数型
数量 = 取数组成员数 (参数组)
.如果真 (数量 ≤ 0)
返回 ()
.如果真结束
tmp = 0
.判断循环首 (tmp ≤ 数量)
tmp = tmp × 3 + 1
.判断循环尾 ()
.判断循环首 (tmp > 0)
.变量循环首 (tmp, 数量, 1, i)
j = i - tmp
临时 = 参数组 [i]
.判断循环首 (j > 0 且 参数组 [j] > 临时)
参数组 [j + tmp] = 参数组 [j]
j = j - tmp
.判断循环尾 ()
参数组 [j + tmp] = 临时
.变量循环尾 ()
tmp = (tmp - 1) ÷ 3
.判断循环尾 ()
希尔排序汇编
.版本 2 .支持库 spec .子程序 希尔排序汇编 .参数 iarray, 整数型, 数组 .局部变量 len, 整数型, , , 长度 .局部变量 p, 整数型 .局部变量 rarray, 整数型, , "0", 排序后的数组 .局部变量 arrBuf, 字节集 len = 取数组成员数 (iarray) p = ShellSort (取变量数据地址 (iarray), len) arrBuf = 指针到字节集 (p, len × 4) 重定义数组 (rarray, 假, len) RtlMoveMemory_arrn (rarray, arrBuf, len × 4) 调试输出 (rarray)
希尔算法
.版本 2
.子程序 ShellSort, 整数型, , 返回排序好后的数组指针(希尔算法)
.参数 array, 整数型, , 数组指针
.参数 len, 整数型, , 数组长度
置入代码 ({ 131, 236, 16, 86, 139, 69, 12, 153, 43, 194, 209, 248, 137, 69, 248, 131, 125, 248, 0, 15, 142, 131, 0, 0, 0, 139, 69, 248, 137, 69, 244, 235, 9, 139, 77, 244, 131, 193, 1, 137, 77, 244, 139, 85, 244, 59, 85, 12, 125, 90, 139, 69, 244, 139, 77, 8, 139, 20, 129, 137, 85, 252, 139, 69, 244, 43, 69, 248, 137, 69, 240, 131, 125, 240, 0, 124, 46, 139, 77, 240, 139, 85, 8, 139, 4, 138, 59, 69, 252, 126, 32, 139, 77, 240, 3, 77, 248, 139, 85, 8, 139, 69, 240, 139, 117, 8, 139, 4, 134, 137, 4, 138, 139, 77, 240, 43, 77, 248, 137, 77, 240, 235, 204, 139, 85, 240, 3, 85, 248, 139, 69, 8, 139, 77, 252, 137, 12, 144, 235, 149, 139, 69, 248, 153, 43, 194, 209, 248, 137, 69, 248, 233, 115, 255, 255, 255, 139, 69, 8, 94, 139, 229, 93, 194, 8, 0 })
返回 (0)