设为首页收藏本站淘宝杂货铺

从F到0 - From F to 0

 找回密码
 注册已关闭
搜索
查看: 2304|回复: 2
收起左侧

易语言MASM置入代码实现升序线性数组表二分折半与顺序查找索引搜索算法 (返回整数型)

[复制链接]
发表于 2020-3-6 17:05:20 | 显示全部楼层 |阅读模式
* “正在初始化数组...”
* “正在二分查找...”
* 88888888 | -1214262654 | “每条查询耗时45.2ns”
* “正在顺序查找...”
* 88888888 | -1214262654 | “每条查询耗时550.68ms”
被调试易程序运行完毕

1.png

  1. .版本 2
  2. .支持库 spec

  3. .程序集 程序集1

  4. .子程序 _启动子程序, 整数型, , 请在本子程序中放置易模块初始化代码

  5. 置随机数种子 ()
  6. _临时子程序 ()  ' 在初始化代码执行完毕后调用测试代码
  7. 返回 (0)  ' 可以根据您的需要返回任意数值

  8. .子程序 _临时子程序
  9. .局部变量 数组, 整数型, , "100000000"
  10. .局部变量 计数, 整数型
  11. .局部变量 索引, 整数型
  12. .局部变量 时间, 整数型
  13. .局部变量 数字, 整数型
  14. .局部变量 值, 整数型

  15. 调试输出 (“正在初始化数组...”)
  16. 数字 = -2147483648
  17. .计次循环首 (100000000, 计数)
  18.     数组 [计数] = 数字
  19.     数字 = 数字 + 取随机数 (1, 20)
  20. .计次循环尾 ()
  21. 调试输出 (“正在二分查找...”)
  22. 时间 = 取启动时间 ()
  23. 值 = 数组 [88888888]
  24. .计次循环首 (1000000, )
  25.     索引 = 二分查找 (数组, 值)
  26. .计次循环尾 ()
  27. 调试输出 (索引, 数组 [索引], “每条查询耗时” + 到文本 ((取启动时间 () - 时间) ÷ 10000000 × 1000 × 1000) + “ns”)
  28. 调试输出 (“正在顺序查找...”)
  29. 时间 = 取启动时间 ()
  30. .计次循环首 (100, )
  31.     索引 = 顺序查找 (数组, 值)
  32. .计次循环尾 ()
  33. 调试输出 (索引, 数组 [索引], “每条查询耗时” + 到文本 ((取启动时间 () - 时间) ÷ 100) + “ms”)



  34. .子程序 二分查找, 整数型, 公开, 未找到返回0,找到返回索引
  35. .参数 数组, 整数型, 数组, 数组必须从小到大,否则将出错
  36. .参数 值, 整数型

  37. 置入代码 ({ 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 })
  38. ' push ebx
  39. ' push ecx
  40. ' push edx
  41. ' push esi
  42. ' push edi
  43. ' push ebp
  44. ' mov ebx,1
  45. ' mov edi,[ebp+8]
  46. ' mov esi,[ebp+12]
  47. ' mov edi,[edi]
  48. ' mov ecx,1
  49. ' mov ecx,[edi+4]
  50. ' add edi,8
  51. ' call HALVE
  52. ' .while SDWORD PTR ebx <= ecx
  53. ' dec edx
  54. ' mov ebp,[edi+edx*4]
  55. ' inc edx
  56. ' .if SDWORD PTR esi >= ebp
  57. ' .if esi == ebp
  58. ' mov eax,edx
  59. ' jmp ASM_END
  60. ' .endif
  61. ' lea ebx,[edx+1]
  62. ' .else
  63. ' lea ecx,[edx-1]
  64. ' .endif
  65. ' call HALVE
  66. ' .endw
  67. ' .if SDWORD PTR ebx <= ecx
  68. ' mov eax,edx
  69. ' .elseif
  70. ' xor eax,eax
  71. ' .endif
  72. ' ASM_END:
  73. ' pop ebp
  74. ' pop edi
  75. ' pop esi
  76. ' pop edx
  77. ' pop ecx
  78. ' pop ebx
  79. ' leave
  80. ' retn 8
  81. ' HALVE:
  82. ' lea edx,[ebx+ecx]
  83. ' shr edx,1
  84. ' ret

  85. 返回 (0)


  86. .子程序 顺序查找, 整数型, 公开
  87. .参数 数组, 整数型, 数组, 允许无序数组
  88. .参数 值, 整数型

  89. 置入代码 ({ 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 })
  90. ' push ebx
  91. ' push ecx
  92. ' push edx
  93. ' push esi
  94. ' xor eax,eax
  95. ' mov ebx,[ebp+8]
  96. ' mov esi,[ebp+12]
  97. ' mov ebx,[ebx]
  98. ' mov edx,[ebx+4]
  99. ' add ebx,8
  100. ' xor ecx,ecx
  101. ' .while ecx<edx
  102. ' .if esi == [ecx*4+ebx]
  103. ' mov eax,ecx
  104. ' inc eax
  105. ' jmp ASM_END
  106. ' .endif
  107. ' inc ecx
  108. ' .endw
  109. ' ASM_END:
  110. ' pop esi
  111. ' pop edx
  112. ' pop ecx
  113. ' pop ebx
  114. ' leave
  115. ' retn 8
  116. ' end

  117. 返回 (0)

  118. .子程序 二分查找_易源码, 整数型
  119. .参数 数组, 整数型, 数组
  120. .参数 值, 整数型
  121. .局部变量 首, 整数型, , , ebx
  122. .局部变量 末, 整数型, , , ecx
  123. .局部变量 中, 整数型, , , edx

  124. 首 = 1
  125. 末 = 取数组成员数 (数组)
  126. 中 = 右移 (首 + 末, 1)
  127. .判断循环首 (首 ≤ 末)
  128.     .如果 (值 ≥ 数组 [中])
  129.         .如果真 (值 = 数组 [中])
  130.             返回 (中)
  131.         .如果真结束
  132.         首 = 中 + 1
  133.     .否则
  134.         末 = 中 - 1
  135.     .如果结束
  136.     中 = 右移 (首 + 末, 1)
  137. .判断循环尾 ()
  138. .如果真 (首 ≤ 末)
  139.     返回 (中)
  140. .如果真结束
  141. 返回 (0)



  142. .子程序 顺序查找_易源码, 整数型
  143. .参数 数组, 整数型, 数组
  144. .参数 值, 整数型
  145. .局部变量 计数, 整数型

  146. .计次循环首 (取数组成员数 (数组), 计数)
  147.     .如果真 (数组 [计数] = 值)
  148.         返回 (计数)
  149.     .如果真结束

  150. .计次循环尾 ()
  151. 返回 (0)
复制代码

相关帖子

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

本版积分规则

QQ|手机版|Archiver|从F到0 ( 蒙ICP备17002595号-1 )
蒙公网安备15010402000325号

腾讯云安全认证

GMT+8, 2024-4-20 02:43 , Processed in 0.643037 second(s), 22 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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