Помощь в определении этого алгоритма сортировки - PullRequest
0 голосов
/ 19 ноября 2009

Я столкнулся с этим алгоритмом сортировки при поиске функции для сортировки коллекции объектов в 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 элементов со случайным смещением, подходит ли этот алгоритм или я должен попытаться реализовать что-то еще?

1 Ответ

2 голосов
/ 19 ноября 2009

Я считаю, что это Выбор сортировки .

Edit: Чтобы ответить на ваш вопрос, это не быстрый алгоритм, это O (n 2 ), но, если это ваша единственная обработка, я думаю, что O (n 2 ) для 300 элементов хорошо.

Вам, вероятно, следует протестировать всю программу, а затем судить, нужна ли вам оптимизация или нет. Просто помните, что ваш алгоритм сортировки может быть оптимизирован.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...