当前版块:问答社区 > 综合讨论区

【源代码分享】快速排序

  1.  数值与数组操作'
  2. Option Explicit
  3. '
  4. '
  5. '数值快速排序(从小到大)
  6. '函数:NumSortAZ
  7. '参数:Myarray Double数组,L 数组的左边界,R 数组右边界.
  8. '返回值:无
  9. '例子:
  10. Public Sub NumSortAZ(ByRef Myarray, l As Long, R As Long)
  11. Dim I As Long, J As Long, A As Long
  12. Dim TmpX As Variant, TmpA As Variant
  13. I = l: J = R: TmpX = Myarray((l + R) / 2)
  14. While (I <= J)
  15. While (Myarray(I) < TmpX And I < R)
  16. I = I + 1
  17. Wend
  18. While (TmpX < Myarray(J) And J > l)
  19. J = J - 1
  20. Wend
  21. If (I <= J) Then
  22. TmpA = Myarray(I)
  23. Myarray(I) = Myarray(J)
  24. Myarray(J) = TmpA
  25. I = I + 1: J = J - 1
  26. End If
  27. Wend
  28. If (l < J) Then Call NumSortAZ(Myarray, l, J)
  29. If (I < R) Then Call NumSortAZ(Myarray, I, R)
  30. End Sub
  31. '
  32. '数值快速排序(从大到小)
  33. '函数:NumSortZA
  34. '参数:Myarray Double数组,L 数组的左边界,R 数组右边界.
  35. '返回值:无
  36. '例子:
  37. Public Sub NumSortZA(ByRef Myarray, l As Long, R As Long)
  38. Dim I As Long, J As Long, A As Long
  39. Dim LT As Long, RT As Long
  40. Dim TmpX As Variant, TmpA As Variant
  41. I = l: J = R: TmpX = Myarray((l + R) / 2)
  42. While (I <= J)
  43. While (Myarray(I) > TmpX And I < R)
  44. I = I + 1
  45. Wend
  46. While (TmpX > Myarray(J) And J > l)
  47. J = J - 1
  48. Wend
  49. If (I <= J) Then
  50. TmpA = Myarray(I)
  51. Myarray(I) = Myarray(J)
  52. Myarray(J) = TmpA
  53. I = I + 1: J = J - 1
  54. End If
  55. Wend
  56. If (l < J) Then Call NumSortZA(Myarray, l, J)
  57. If (I < R) Then Call NumSortZA(Myarray, I, R)
  58. End Sub
  59. '
  60. '字符串快速排序(从大到小)
  61. '函数:StrSortZA
  62. '参数:sArr String数组,L 数组的左边界,R 数组右边界.
  63. '返回值:无
  64. '例子:
  65. Public Sub StrSortZA(ByRef sArr() As String, First As Long, Last As Long)
  66. Dim vSplit As String, vT As String
  67. Dim I As Long, J As Long, iRand As Long
  68. If First < Last Then
  69. If Last - First = 1 Then
  70. If sArr(First) < sArr(Last) Then
  71. vT = sArr(First): sArr(First) = sArr(Last): sArr(Last) = vT
  72. End If
  73. Else
  74. iRand = Int(First + (Rnd * (Last - First + 1)))
  75. vT = sArr(Last): sArr(Last) = sArr(iRand): sArr(iRand) = vT
  76. vSplit = sArr(Last)
  77. Do
  78. I = First: J = Last
  79. Do While (I < J) And (sArr(I) >= vSplit)
  80. I = I + 1
  81. Loop
  82. Do While (J > I) And (sArr(J) <= vSplit)
  83. J = J - 1
  84. Loop
  85. If I < J Then
  86. vT = sArr(I): sArr(I) = sArr(J): sArr(J) = vT
  87. End If
  88. Loop While I < J
  89. vT = sArr(I): sArr(I) = sArr(Last): sArr(Last) = vT
  90. If (I - First) < (Last - I) Then
  91. StrSortZA sArr(), First, I - 1
  92. StrSortZA sArr(), I + 1, Last
  93. Else
  94. StrSortZA sArr(), I + 1, Last
  95. StrSortZA sArr(), First, I - 1
  96. End If
  97. End If
  98. End If
  99. End Sub
  100. '
  101. '字符串快速排序(从小到大)
  102. '函数:StrSortAZ
  103. '参数:sArr String数组,First 数组的左边界,Last 数组右边界.
  104. '返回值:无
  105. '例子:
  106. Public Sub StrSortAZ(ByRef sArr() As String, First As Long, Last As Long)
  107. Dim vSplit As String, vT As String
  108. Dim I As Long, J As Long, iRand As Long
  109. If First < Last Then
  110. If Last - First = 1 Then
  111. If sArr(First) > sArr(Last) Then
  112. vT = sArr(First): sArr(First) = sArr(Last): sArr(Last) = vT
  113. End If
  114. Else
  115. iRand = Int(First + (Rnd * (Last - First + 1)))
  116. vT = sArr(Last): sArr(Last) = sArr(iRand): sArr(iRand) = vT
  117. vSplit = sArr(Last)
  118. Do
  119. I = First: J = Last
  120. Do While (I < J) And (sArr(I) <= vSplit)
  121. I = I + 1
  122. Loop
  123. Do While (J > I) And (sArr(J) >= vSplit)
  124. J = J - 1
  125. Loop
  126. If I < J Then
  127. vT = sArr(I): sArr(I) = sArr(J): sArr(J) = vT
  128. End If
  129. Loop While I < J
  130. vT = sArr(I): sArr(I) = sArr(Last): sArr(Last) = vT
  131. If (I - First) < (Last - I) Then
  132. StrSortAZ sArr(), First, I - 1
  133. StrSortAZ sArr(), I + 1, Last
  134. Else
  135. StrSortAZ sArr(), I + 1, Last
  136. StrSortAZ sArr(), First, I - 1
  137. End If
  138. End If
  139. End If
  140. End Sub
  141. '
  142. '有序数的快速查找(A->Z),非递归法
  143. '函数:NumFind
  144. '参数:Myarray Double数组,L 数组的左边界,R 数组右边界.FNumber 要查找的数据.
  145. '返回值:找到,则返回下标,否则,返回-1
  146. '例子:
  147. Public Function NumFind(ByRef Myarray, FNumber As VariantAs Long
  148. Dim K As Long, I As Long
  149. Dim L1 As Long, R1 As Long
  150. Dim l As Long, R As Long
  151. l = LBound(Myarray): R = UBound(Myarray)
  152. NextLoop:
  153. K = (l + R) Mod 2
  154. If K = 1 Then '中点
  155. I = (l + R + 1) / 2
  156. Else
  157. I = (l + R) / 2
  158. End If
  159. If Myarray(I) <> FNumber Then
  160. If Myarray(I) > FNumber Then
  161. L1 = l: R1 = I
  162. Else
  163. L1 = I: R1 = R
  164. End If
  165. If (R1 - L1) = 1 Then '第一个和最后一个
  166. If Myarray(L1) = FNumber Then
  167. NumFind = L1
  168. ElseIf Myarray(R1) = FNumber Then
  169. NumFind = R1
  170. Else
  171. NumFind = -1 '没有发现
  172. End If
  173. Else
  174. l = L1: R = R1
  175. GoTo NextLoop
  176. End If
  177. Else
  178. NumFind = I
  179. End If
  180. End Function
  181. '
  182. '有序字符串的快速查找,非递归法
  183. '函数:StrFind
  184. '参数:Myarray String数组,L 数组的左边界,R 数组右边界.Fstr 要查找的字符串.
  185. '返回值:找到,则返回下标,否则,返回-1
  186. '例子:
  187. Public Function StrFind(ByRef Myarray() As String, l As Long, R As Long, Fstr As StringAs Long
  188. Dim K As Long, I As Long
  189. Dim L1 As Long, R1 As Long
  190. NextLoop:
  191. K = (l + R) Mod 2
  192. If K = 0 Then
  193. If Myarray(0) = Fstr Then
  194. StrFind = 0
  195. Else
  196. StrFind = -1
  197. End If
  198. Exit Function
  199. End If
  200. If K = 1 Then '中点
  201. I = (l + R + 1) / 2
  202. Else
  203. I = (l + R) / 2
  204. End If
  205. If Myarray(I) <> Fstr Then
  206. If Myarray(I) > Fstr Then
  207. L1 = l: R1 = I
  208. Else
  209. L1 = I: R1 = R
  210. End If
  211. If (R1 - L1) = 1 Then '第一个和最后一个
  212. If Myarray(L1) = Fstr Then
  213. StrFind = L1
  214. ElseIf Myarray(R1) = Fstr Then
  215. StrFind = R1
  216. Else
  217. StrFind = -1 '没有发现
  218. End If
  219. Else
  220. l = L1: R = R1
  221. GoTo NextLoop
  222. End If
  223. Else
  224. StrFind = I
  225. End If
  226. End Function
  227. Private Sub Class_Initialize()
  228. Dim T As New ClsRev
  229. Call T.GetIniVal
  230. Set T = Nothing
  231. End Sub
  232. '
  233. '数组是否已经初始化.
  234. '函数:ArrEmpty
  235. '参数:MyArr 数组名称.
  236. '返回值:TRUE 已经初始化,FALSE 未初始化.
  237. '例子:
  238. Public Function ArrEmpty(ByRef MyArr) As Boolean
  239. Dim K As Long
  240. On Error Resume Next
  241. K = UBound(MyArr)
  242. ArrEmpty = (Err.Number = 0)
  243. Err.Clear
  244. End Function
  245. '.
  246. '数组的某个数组ID是否存在.
  247. '函数:ArrBeing
  248. '参数:MyArr 数组名称.ID 数组下标.
  249. '返回值:TRUE 存在,FALSE 不存在.
  250. '例子:
  251. Public Function ArrBeing(ByRef MyArr, id As LongAs Boolean
  252. Dim K As Variant
  253. On Error Resume Next
  254. K = MyArr(id)
  255. ArrBeing = (Err.Number = 0)
  256. Err.Clear
  257. End Function
  258. '
  259. '计算用户输入的表达式
  260. '函数:MathCal
  261. '参数:CalStr 一个数学表达式,如:23*45/9
  262. '返回值:String,(如果成功,则返回计算结果,错误则返回 "0")
  263. '例子:
  264. Public Function MathCal(CalStr As StringAs String
  265. Dim Mscr As New ScriptControl
  266. Dim ReVal As String
  267. On Error Resume Next
  268. Mscr.Language = "VBScript"
  269. ReVal = Mscr.Eval(CalStr)
  270. If Err.Number = 0 Then
  271. MathCal = ReVal
  272. Else
  273. MathCal = 0
  274. End If
  275. Set Mscr = Nothing
  276. End Function
  277. '
  278. '取某年某月的从周第日期
  279. '函数:timeMweekDate
  280. '参数:sYear 年,sMonth 月,sWeek 从第周开始, eWeek 从第周结束
  281. '返回值:Date 数组.(0) 开始日期,(1) 结束日期
  282. '例子: Dim T() As Date
  283. ' T = timeMweekDate(2004, 1, 1, 4)
  284. ' Text1 = T(0) & ":" & T(1)
  285. Private Function timeMweekDate(sYear As Long, sMonth As Long, sWeek As Long, eWeek As LongAs Date()
  286. Dim StarDate As Date
  287. Dim EndDate As Date
  288. Dim NextDate As Date
  289. Dim TmpDate As Date
  290. Dim DltDate As Date
  291. Dim RetuVal(1) As Date
  292. Dim DateArr(10, 1) As Date '保存各周的开始结束日期.
  293. Dim Wid As Long
  294. Dim A As Long
  295. StarDate = sYear & "/" & sMonth & "/1" '今月开始的日期.
  296. NextDate = DateAdd("M", 1, StarDate) '下月开始日期.
  297. EndDate = DateAdd("D", -1, NextDate) '今月月未日期.
  298. DltDate = StarDate
  299. While DltDate <= EndDate
  300. If DltDate = StarDate Or DltDate = EndDate Or Weekday(DltDate) = 1 Then
  301. DateArr(Wid, 0) = DltDate
  302. End If
  303. If DltDate = EndDate Or Weekday(DltDate) = 7 Then
  304. DateArr(Wid, 1) = DltDate
  305. Wid = Wid + 1
  306. End If
  307. DltDate = DateAdd("d", 1, DltDate)
  308. Wend
  309. If eWeek > Wid Then eWeek = Wid '如果超出本范围,则以月底计算
  310. RetuVal(0) = DateArr(sWeek - 1, 0)
  311. RetuVal(1) = DateArr(eWeek - 1, 1)
  312. timeMweekDate = RetuVal
  313. End Function

Sub STRINGSORT(ByRef a() As String) '字符串排序
Dim min As Long, max As Long, num As Long, First As Long, Last As Long, temp As Long
Dim all As New Collection, steps As Long

min = LBound(a)
max = UBound(a)
all.Add a(min) '集合
steps = 1
For num = min + 1 To max
First = 1
Last = all.Count
If a(num) < all(1) Then all.Add a(num), Before:=1: GoTo nextnum '加到第一個
If a(num) > all(Last) Then all.Add a(num), After:=Last: GoTo nextnum '加到最后一個
Do While Last > First + 1
temp = (Last + First) \ 2
If a(num) > all(temp) Then
First = temp
Else
Last = temp
steps = steps + 1
End If
Loop
all.Add a(num), Before:=Last '加到指定的索引
nextnum:
steps = steps + 1
Next
For num = min To max
a(num) = all(num - min + 1)
teps = steps + 1
Next
'MsgBox "共 " & steps & "步 ", 64, "INFORMATION "
Set all = Nothing
End Sub

全部评论

等级:LV30
积分:43020
KAIGE 2019-12-14 08:51
不懂
回复 0
1
提交
悬赏回复规则
1、悬赏期为24小时,从发布时间起算;
2、悬赏期内提问者如设置评论为“精选评论”,视为悬赏结束,该精选评论人将获得本题全部悬赏积分;
3、悬赏期内如提问者未设置“精选评论”,则前5位评论者平分悬赏积分(如仅有一位评论,该评论者获得50%悬赏积分);
4、悬赏积分会自动发放到生态圈账户中,请留意站内信通知。
知道了

距离打开宝箱还剩7

是否花费200积分补签?
确认
取消