|
本帖最后由 时间的音符 于 2024-8-22 22:48 编辑
Public Sub main()
t = Timer
nums = [b3:e20567]
ReDim indexs(LBound(nums) To UBound(nums))
For i = LBound(nums) To UBound(nums)
indexs(i) = i
Next
rules = [{-1,-1,1,1}]
Call qSort(nums, LBound(nums), UBound(nums), rules, 1, indexs)
ans = nums
For i = LBound(nums, 1) To UBound(nums, 1)
For j = LBound(nums, 2) To UBound(nums, 2)
ans(i, j) = nums(indexs(i), j)
Next
Next
[l3].Resize(UBound(nums, 1), UBound(nums, 2)) = ans
MsgBox Timer - t
End Sub
Private Function random(lo, hi)
random = Int(Rnd * (hi - lo + 1)) + lo
End Function
Private Function swap(indexs, a, b)
tmp = indexs(a)
indexs(a) = indexs(b)
indexs(b) = tmp
End Function
Private Function qSort(nums, lo, hi, rules, level, indexs)
If lo >= hi Or level > UBound(rules) Then Exit Function
If rules(level) = 0 Then
Call qSort(nums, lo, hi, rules, level + 1, indexs)
Exit Function
End If
pre = random(lo, hi)
swap indexs, pre, lo
l1 = lo: l2 = hi + 1
i = lo + 1
Do While i < l2
t = (nums(indexs(i), level) - nums(indexs(lo), level)) * rules(level)
If t < 0 Then
swap indexs, i, l1 + 1
i = i + 1
l1 = l1 + 1
ElseIf t > 0 Then
swap indexs, i, l2 - 1
l2 = l2 - 1
Else
i = i + 1
End If
Loop
swap indexs, lo, l1
Call qSort(nums, l1, l2 - 1, rules, level + 1, indexs)
Call qSort(nums, lo, l1 - 1, rules, level, indexs)
Call qSort(nums, l2, hi, rules, level, indexs)
End Function
|
|