|
* “正在初始化数组...”
* “正在二分查找...”
* 88888888 | -1214262654 | “每条查询耗时45.2ns”
* “正在顺序查找...”
* 88888888 | -1214262654 | “每条查询耗时550.68ms”
被调试易程序运行完毕
- .版本 2
- .支持库 spec
- .程序集 程序集1
- .子程序 _启动子程序, 整数型, , 请在本子程序中放置易模块初始化代码
- 置随机数种子 ()
- _临时子程序 () ' 在初始化代码执行完毕后调用测试代码
- 返回 (0) ' 可以根据您的需要返回任意数值
- .子程序 _临时子程序
- .局部变量 数组, 整数型, , "100000000"
- .局部变量 计数, 整数型
- .局部变量 索引, 整数型
- .局部变量 时间, 整数型
- .局部变量 数字, 整数型
- .局部变量 值, 整数型
- 调试输出 (“正在初始化数组...”)
- 数字 = -2147483648
- .计次循环首 (100000000, 计数)
- 数组 [计数] = 数字
- 数字 = 数字 + 取随机数 (1, 20)
- .计次循环尾 ()
- 调试输出 (“正在二分查找...”)
- 时间 = 取启动时间 ()
- 值 = 数组 [88888888]
- .计次循环首 (1000000, )
- 索引 = 二分查找 (数组, 值)
- .计次循环尾 ()
- 调试输出 (索引, 数组 [索引], “每条查询耗时” + 到文本 ((取启动时间 () - 时间) ÷ 10000000 × 1000 × 1000) + “ns”)
- 调试输出 (“正在顺序查找...”)
- 时间 = 取启动时间 ()
- .计次循环首 (100, )
- 索引 = 顺序查找 (数组, 值)
- .计次循环尾 ()
- 调试输出 (索引, 数组 [索引], “每条查询耗时” + 到文本 ((取启动时间 () - 时间) ÷ 100) + “ms”)
- .子程序 二分查找, 整数型, 公开, 未找到返回0,找到返回索引
- .参数 数组, 整数型, 数组, 数组必须从小到大,否则将出错
- .参数 值, 整数型
- 置入代码 ({ 83, 81, 82, 86, 87, 85, 187, 1, 0, 0, 0, 139, 125, 8, 139, 117, 12, 139, 63, 185, 1, 0, 0, 0, 139, 79, 4, 131, 199, 8, 232, 56, 0, 0, 0, 235, 30, 74, 139, 44, 151, 66, 59, 245, 124, 13, 59, 245, 117, 4, 139, 194, 235, 27, 141, 90, 1, 235, 3, 141, 74, 255, 232, 24, 0, 0, 0, 59, 217, 126, 222, 59, 217, 127, 4, 139, 194, 235, 2, 51, 192, 93, 95, 94, 90, 89, 91, 201, 194, 8, 0, 141, 20, 25, 209, 234, 195 })
- ' push ebx
- ' push ecx
- ' push edx
- ' push esi
- ' push edi
- ' push ebp
- ' mov ebx,1
- ' mov edi,[ebp+8]
- ' mov esi,[ebp+12]
- ' mov edi,[edi]
- ' mov ecx,1
- ' mov ecx,[edi+4]
- ' add edi,8
- ' call HALVE
- ' .while SDWORD PTR ebx <= ecx
- ' dec edx
- ' mov ebp,[edi+edx*4]
- ' inc edx
- ' .if SDWORD PTR esi >= ebp
- ' .if esi == ebp
- ' mov eax,edx
- ' jmp ASM_END
- ' .endif
- ' lea ebx,[edx+1]
- ' .else
- ' lea ecx,[edx-1]
- ' .endif
- ' call HALVE
- ' .endw
- ' .if SDWORD PTR ebx <= ecx
- ' mov eax,edx
- ' .elseif
- ' xor eax,eax
- ' .endif
- ' ASM_END:
- ' pop ebp
- ' pop edi
- ' pop esi
- ' pop edx
- ' pop ecx
- ' pop ebx
- ' leave
- ' retn 8
- ' HALVE:
- ' lea edx,[ebx+ecx]
- ' shr edx,1
- ' ret
- 返回 (0)
- .子程序 顺序查找, 整数型, 公开
- .参数 数组, 整数型, 数组, 允许无序数组
- .参数 值, 整数型
- 置入代码 ({ 83, 81, 82, 86, 51, 192, 139, 93, 8, 139, 117, 12, 139, 27, 139, 83, 4, 131, 195, 8, 51, 201, 235, 11, 59, 52, 139, 117, 5, 139, 193, 64, 235, 5, 65, 59, 202, 114, 241, 94, 90, 89, 91, 201, 194, 8, 0 })
- ' push ebx
- ' push ecx
- ' push edx
- ' push esi
- ' xor eax,eax
- ' mov ebx,[ebp+8]
- ' mov esi,[ebp+12]
- ' mov ebx,[ebx]
- ' mov edx,[ebx+4]
- ' add ebx,8
- ' xor ecx,ecx
- ' .while ecx<edx
- ' .if esi == [ecx*4+ebx]
- ' mov eax,ecx
- ' inc eax
- ' jmp ASM_END
- ' .endif
- ' inc ecx
- ' .endw
- ' ASM_END:
- ' pop esi
- ' pop edx
- ' pop ecx
- ' pop ebx
- ' leave
- ' retn 8
- ' end
- 返回 (0)
- .子程序 二分查找_易源码, 整数型
- .参数 数组, 整数型, 数组
- .参数 值, 整数型
- .局部变量 首, 整数型, , , ebx
- .局部变量 末, 整数型, , , ecx
- .局部变量 中, 整数型, , , edx
- 首 = 1
- 末 = 取数组成员数 (数组)
- 中 = 右移 (首 + 末, 1)
- .判断循环首 (首 ≤ 末)
- .如果 (值 ≥ 数组 [中])
- .如果真 (值 = 数组 [中])
- 返回 (中)
- .如果真结束
- 首 = 中 + 1
- .否则
- 末 = 中 - 1
- .如果结束
- 中 = 右移 (首 + 末, 1)
- .判断循环尾 ()
- .如果真 (首 ≤ 末)
- 返回 (中)
- .如果真结束
- 返回 (0)
- .子程序 顺序查找_易源码, 整数型
- .参数 数组, 整数型, 数组
- .参数 值, 整数型
- .局部变量 计数, 整数型
- .计次循环首 (取数组成员数 (数组), 计数)
- .如果真 (数组 [计数] = 值)
- 返回 (计数)
- .如果真结束
- .计次循环尾 ()
- 返回 (0)
复制代码
|
|