Я столкнулся с этим алгоритмом сортировки при поиске функции для сортировки коллекции объектов в VBA по свойству объекта. Чтобы убедиться, что я понимаю все аспекты кода, который я реализую, я хотел проверить свои мысли об этом алгоритме. Для меня это похоже на сортировку вставкой, но я хотел бы проверить у сообщества, чтобы убедиться, что я был прав.
Чтобы помочь себе лучше понять это, я собрал этот псевдокод того, что, по моему мнению, выполняет функция. (Просто предположим, что он будет отсортирован в порядке возрастания)
UnknownSort(collection C)
for i=1 to C.Count - 1
begin
x = C[i].Value
index = i
for j=i+1 to C.Count
begin
y = C[j].Value
if x > y then
x = y
index = j
j++
end
if index <> i then
temp = C[index]
C.Remove(index)
C.Add temp before C[i]
i = i + 1
end
Я включил код и на тот случай, если допустил ошибку в псевдокоде выше.
Для тех, кто не знаком с VBA, col.Add obj, i вставляет объект в коллекцию перед объектом i в коллекции.
Private Function SortCollection(col As Collection, psSortPropertyName As String, pbAscending As Boolean) As Collection
Dim obj As Object
Dim i As Integer
Dim j As Integer
Dim iMinMaxIndex As Integer
Dim vMinMax As Variant
Dim vValue As Variant
Dim bSortCondition As Boolean
Dim bUseKey As Boolean
Dim sKey As String
For i = 1 To col.Count - 1
Set obj = col(i)
vMinMax = CallByName(obj, psSortPropertyName, VbGet)
iMinMaxIndex = i
For j = i + 1 To col.Count
Set obj = col(j)
vValue = CallByName(obj, psSortPropertyName, VbGet)
If (pbAscending) Then
bSortCondition = (vValue < vMinMax)
Else
bSortCondition = (vValue > vMinMax)
End If
If (bSortCondition) Then
vMinMax = vValue
iMinMaxIndex = j
End If
Set obj = Nothing
Next j
If (iMinMaxIndex <> i) Then
Set obj = col(iMinMaxIndex)
col.Remove iMinMaxIndex
col.Add obj, , i
Set obj = Nothing
End If
Set obj = Nothing
Next i
Set SortCollection = col
End Function
Редактировать
Для списка, который никогда не будет длиннее 300 элементов со случайным смещением, подходит ли этот алгоритм или я должен попытаться реализовать что-то еще?